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.

Api biru
sumber
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 .

Ricardo Altamirano
sumber
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
sumber
@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.

Sylvain Leroux
sumber
8

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

Thomas
sumber
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.

fvu
sumber
5

Sesederhana:

String charIs = string.charAt(index) + "";
Aqif Hamid
sumber
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);
    }
}
silversk8terz
sumber
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

Thiago Silva
sumber
-3

Seperti ini:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
Kadar Kabouya Kalo
sumber
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