Dapatkan karakter string dengan indeks - Java


231

Saya tahu cara menyusun indeks karakter atau angka tertentu dalam string, tetapi apakah ada metode standar yang dapat saya gunakan untuk memberi saya karakter di posisi ke - n ? Jadi dalam string "foo", jika saya meminta karakter dengan indeks 0 itu akan mengembalikan "f".

Catatan - dalam pertanyaan di atas, berdasarkan "karakter" yang saya maksud bukan tipe data char, melainkan huruf atau angka dalam sebuah string. Yang penting di sini adalah bahwa saya tidak menerima char ketika metode dipanggil, tetapi sebuah string (panjang 1). Dan saya tahu tentang metode substring (), tapi saya bertanya-tanya apakah ada cara yang lebih rapi.


13
Ini? Jawabannya sangat mudah.
ametren

Apakah Anda memperhatikan bahwa dia tidak menginginkan charnilai? Dan dia tahu bagaimana melakukannya substring()tetapi hanya menginginkan cara yang "lebih rapi". FYI, bisa saya katakan itu substring()adalah cara yang paling rapi.
user845279

3
@ user845279 Character.toStringmemenuhi semua persyaratan yang diperlukan dan tidak berantakan sama sekali.
Ricardo Altamirano

@pythonscript Saya setuju, tetapi tidak jauh berbeda dengan menggunakan substring()secara langsung.
user845279

1
Saya terlambat ke pesta ini, tapi @RicardoAltamirano agak salah. The endIndex(parameter kedua) dari String.substring(int, int)adalah eksklusif indeks, dan itu tidak akan melemparkan sebuah pengecualian untuk index + 1selama index < length()- yang benar bahkan untuk karakter terakhir dalam string.
William Price

Jawaban:


340

Metode yang Anda cari adalah charAt. Ini sebuah contoh:

String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f

Untuk informasi lebih lanjut, lihat dokumentasi Java diString.charAt . Jika Anda ingin tutorial sederhana lainnya, ini atau ini .

Jika Anda tidak ingin hasilnya sebagai chartipe data, melainkan sebagai string, Anda akan menggunakan Character.toStringmetode ini:

String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f

Jika Anda ingin informasi lebih lanjut tentang Characterkelas dan toStringmetodenya, saya mengambil info dari dokumentasi di Character.toString .


1
"Yang penting di sini adalah bahwa saya tidak menerima char ketika metode dipanggil, tetapi sebuah string", tapi terima kasih tetap (upvote): D
Bluefire

1
Saya pikir jawaban Sylvain Leroux lebih baik. doc tentang Karakter
Chaojun Zhong

Saya setuju dengan @ChaojunZhong ini adalah jawaban yang lebih cocok karena tidak disarankan untuk menggunakan charAt () karena Anda akan mengalami masalah ketika Anda memiliki karakter yang membutuhkan 2 unit kode.
bpunzalan

43

Kamu ingin .charAt()

Ini tutorialnya

"mystring".charAt(2)

kembali s

Jika Anda sangat ingin memiliki string, ada beberapa cara untuk mengubah char menjadi string:

String mychar = Character.toString("mystring".charAt(2));

Atau

String mychar = ""+"mystring".charAt(2);

Atau bahkan

String mychar = String.valueOf("mystring".charAt(2));

Sebagai contoh.


@ametren Apakah penggabungan string string lebih disukai Character.toString?
Ricardo Altamirano

Saya pikir itu mungkin karena masalah pilihan pribadi. Anda juga bisa melakukannyaString mychar = String.valueOf("mystring".charAt(2));
ametren

Untuk menambah, preferensi pribadi saya dalam hal ini akan String mychar = ""+"mystring".charAt(2);karena itu yang paling singkat. Orang lain akan berbeda pendapat tentang hal ini.
ametren

10

Tak satu pun dari jawaban yang diusulkan berfungsi untuk pasangan pengganti yang digunakan untuk menyandikan karakter di luar Unicode Basic Multiligual Plane .

Berikut adalah contoh menggunakan tiga teknik berbeda untuk beralih ke "karakter" dari string (termasuk menggunakan Java 8 stream API). Harap perhatikan contoh ini termasuk karakter dari Unicode Supplementary Multilingual Plane (SMP). Anda memerlukan font yang tepat untuk menampilkan contoh ini dan hasilnya dengan benar.

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown π“ƒ₯ jumps over the lazy π“Šƒπ“Ώπ“…“π“ƒ‘";

Iterasi karakter

Solusi pertama adalah loop sederhana di atas semua charstring:

/* 1 */
System.out.println(
        "\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
    char c = str.charAt(pos);
    System.out.printf("%s ", Character.toString(c));
    //                       ^^^^^^^^^^^^^^^^^^^^^
    //                   Convert to String as per OP request
}

Iterasi poin kode

Solusi kedua menggunakan loop eksplisit juga, tetapi mengakses poin kode individual dengan codePointAt dan menambah indeks loop sesuai dengan charCount :

/* 2 */
System.out.println(
        "\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
    int cp = str.codePointAt(pos);

    char    chars[] = Character.toChars(cp);
    //                ^^^^^^^^^^^^^^^^^^^^^
    //               Convert to a `char[]`
    //               as code points outside the Unicode BMP
    //               will map to more than one Java `char`
    System.out.printf("%s ", new String(chars));
    //                       ^^^^^^^^^^^^^^^^^
    //               Convert to String as per OP request

    pos += Character.charCount(cp);
    //     ^^^^^^^^^^^^^^^^^^^^^^^
    //    Increment pos by 1 of more depending
    //    the number of Java `char` required to
    //    encode that particular codepoint.
}

Iterasi lebih dari titik kode menggunakan Stream API

Solusi ketiga pada dasarnya sama dengan yang kedua, tetapi menggunakan Java 8 Stream API :

/* 3 */
System.out.println(
        "\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
    cp -> {
        char    chars[] = Character.toChars(cp);
        //                ^^^^^^^^^^^^^^^^^^^^^
        //               Convert to a `char[]`
        //               as code points outside the Unicode BMP
        //               will map to more than one Java `char`
        System.out.printf("%s ", new String(chars));
        //                       ^^^^^^^^^^^^^^^^^
        //               Convert to String as per OP request
    });

Hasil

Ketika Anda menjalankan program pengujian itu, Anda memperoleh:

Using char iterator (do not work for surrogate pairs !)
T h e   q u i c k   b r o w n   ? ?   j u m p s   o v e r   t h e   l a z y   ? ? ? ? ? ? ? ? 

Using Java 1.5 codePointAt(works as expected)
T h e   q u i c k   b r o w n   π“ƒ₯   j u m p s   o v e r   t h e   l a z y   π“Šƒ 𓍿 π“…“ 𓃑 

Using Java 8 stream (works as expected)
T h e   q u i c k   b r o w n   π“ƒ₯   j u m p s   o v e r   t h e   l a z y   π“Šƒ 𓍿 π“…“ 𓃑 

Seperti yang Anda lihat (jika Anda dapat menampilkan hieroglif dengan benar), solusi pertama tidak menangani karakter dengan benar di luar Unicode BMP. Di sisi lain, dua solusi lainnya menghadapi pasangan pengganti.


8

Anda cukup macet substring(), mengingat kebutuhan Anda. Cara standarnya adalah charAt(), tetapi Anda mengatakan Anda tidak akan menerima tipe data char.


Cukup adil. Tapi, karena char adalah tipe primitif, saya berasumsi toString()tidak akan berfungsi, dan valueOf()hanya untuk angka (saya pikir, saya mungkin salah), jadi bagaimana cara mengubah char menjadi string?
Bluefire

"dalam pertanyaan di atas, berdasarkan" karakter "Maksud saya bukan tipe data char" - Saya tidak membaca ini sebagai "Saya tidak akan menerima char"
ametren

@Bluefire Lihat jawaban saya. Character.toStringharus bekerja (ini adalah metode statis dari Characterkelas.
Ricardo Altamirano


5

Pendekatan hybrid yang dikombinasikan charAtdengan kebutuhan Anda untuk tidak mendapatkan char bisa dilakukan

newstring = String.valueOf("foo".charAt(0));

Tapi itu tidak benar-benar "lebih rapi" daripada substring()jujur.



4

Ini kode yang benar. Jika Anda menggunakan zybooks, ini akan menjawab semua masalah.

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

0

jika seseorang berjuang dengan kotlin, kodenya adalah:

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

ini akan mengembalikan char di posisi 1, dalam hal ini k ingat, indeks dimulai di posisi 0, jadi dalam contoh ini: kotlin akan menjadi k = posisi 0, o = posisi 1, t = posisi 2, l = posisi 3, i = posisi 4 dan n = posisi 5


-3

Seperti ini:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);

OP menyatakan bahwa Stringpanjang 1 diinginkan, bukan a char.
William Harga

6 jawaban lainnya, termasuk yang diterima, disarankan charAt()sebagai solusi yang memungkinkan. Apa yang ditambahkan jawaban ini?
Dan Getz

6
Juga, sepertinya Anda mengisyaratkan bahwa charAt()menggunakan indeks berbasis 1, dengan memiliki satu-satunya karakter yang berbeda di aposisi ketiga. Jika itu benar, maka akan lebih baik bagi Anda untuk mengatakan atau menjelaskan itu daripada mengisyaratkan. Pada kenyataannya itu tidak benar: charAt()menggunakan indeks berbasis 0, demikian sjuga halnya 'h'.
Dan Getz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.