Dizeye göre dizgi karakteri alma - Java


230

Bir dize belirli bir karakter veya sayı dizini nasıl çalışacağını biliyorum, ama bana n . Konumda karakter vermek için kullanabileceğiniz önceden tanımlanmış herhangi bir yöntem var mı? Dizede "foo", eğer indeks 0 ile karakter istedi eğer "f" dönecekti.

Not - yukarıdaki soruda, "karakter" ile char veri türü değil, bir dizede bir harf veya sayı anlamına gelir. Burada önemli olan yöntem çağrıldığında bir char almazsınız, ancak (uzunluğu 1) bir dize. Ve substring () yöntemini biliyorum, ama daha temiz bir yol olup olmadığını merak ediyordum.


13
Bu? Cevap oldukça basittir.
ametren

Bir chardeğer istemediğini fark ettiniz mi? Ve nasıl yapılacağını biliyor substring()ama sadece "daha temiz" bir yol istiyor. Bilginize, substring()bunun en güzel yol olduğunu söyleyebilirim .
user845279

3
@ user845279 Character.toStringgerekli tüm gereksinimleri karşılar ve dağınık değildir.
Ricardo Altamirano

@pythonscript Kabul ediyorum, ancak substring()doğrudan kullanmaktan çok farklı değil .
user845279

1
Bu partiye geç kaldım ama @RicardoAltamirano biraz yanılıyor. endIndex(İkinci parametre) String.substring(int, int)bir olduğu münhasır endeks ve alışkanlık için bir istisna index + 1sürece index < length()- hatta dizede geçen karakter için de geçerlidir ki.
William Price

Yanıtlar:


339

Aradığınız yöntem charAt. İşte bir örnek:

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

Daha fazla bilgi için üzerindeki Java belgelerineString.charAt bakın . Başka bir basit öğretici istiyorsanız, bu ya da bu .

Sonucu bir charveri türü olarak değil, bir dize olarak istiyorsanız, Character.toStringyöntemi kullanırsınız :

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

CharacterSınıf ve toStringyöntem hakkında daha fazla bilgi istiyorsanız , bilgilerimi Character.toString üzerindeki belgelerden aldım .


1
"Burada önemli olan yöntem çağrıldığında bir char almıyorum, ama bir dize", ama yine de teşekkürler (yukarı oy): D
Bluefire

1
Bence Sylvain Leroux'un cevabı daha iyi. Karakter
Chaojun Zhong hakkında

@ChaojunZhong ile bu daha uygun bir cevap olduğunu kabul ediyorum, çünkü charAt () kullanılması tavsiye edilmez, çünkü 2 kod birimine ihtiyaç duyan karakterleriniz olduğunda sorunlarınız olacaktır.
bpunzalan

43

İstediğiniz .charAt()

İşte bir eğitim

"mystring".charAt(2)

İadeler s

Bir dizeye sahip olmak konusunda cehennem iseniz, bir karakteri dizeye dönüştürmenin birkaç yolu vardır:

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

Veya

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

Ya da

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

Örneğin.


@ametren Dize dizesi birleştirme tercih edilebilir Character.toStringmi?
Ricardo Altamirano

Bunun kişisel tercih meselesi olabileceğini düşünüyorum. String mychar = String.valueOf("mystring".charAt(2));
Şunu

Yığınlanmak için, bu durumda kişisel tercihim String mychar = ""+"mystring".charAt(2);en özlü olduğu için olurdu . Diğerleri bu konudaki görüşlerinde farklılık gösterecektir.
ametren

10

Önerilen cevapların hiçbiri, Unicode Temel Çok Dilli Düzlem dışındaki karakterleri kodlamak için kullanılan vekil çiftler için geçerli değildir .

Aşağıda, bir dizenin "karakterleri" üzerinde yineleme yapmak için üç farklı teknik kullanan bir örnek verilmiştir (Java 8 akış API'sı dahil). Lütfen bu örnekte Unicode Ek Çok Dilli Düzlem'in (SMP) karakterlerini içerdiğini unutmayın. Bu örneği ve sonucu doğru bir şekilde görüntülemek için uygun bir yazı tipine ihtiyacınız vardır.

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";

Karakterlerin yinelemesi

İlk çözüm tüm chardize üzerinde basit bir döngüdür :

/* 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
}

Kod noktalarının yinelemesi

İkinci çözüm de açık bir döngü kullanır, ancak codePointAt ile tek tek kod noktalarına erişir ve döngü dizinini charCount'a göre artırır :

/* 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.
}

Akış API'sını kullanarak kod noktaları üzerinde yineleme

Üçüncü çözüm temel olarak ikinciyle aynıdır, ancak Java 8 Stream API'sini kullanır :

/* 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
    });

Sonuçlar

Bu test programını çalıştırdığınızda şunları elde edersiniz:

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   𓊃 𓍿 𓅓 𓃡 

Gördüğünüz gibi (hiyeroglifleri düzgün bir şekilde görüntüleyebiliyorsanız), ilk çözüm Unicode BMP dışındaki karakterleri düzgün işlemez. Öte yandan, diğer iki çözüm vekil çiftlerle iyi ilgilenir.


8

substring()İhtiyaçlarınız göz önüne alındığında oldukça sıkışmışsınız . Standart yol olurdu charAt(), ancak bir char veri türünü kabul etmeyeceğinizi söylediniz.


Yeterince adil. Ancak, char ilkel bir tip olduğu için, toString()üzerinde çalışmayacağını ve valueOf()sadece sayılar için olduğunu düşünüyorum (sanırım, yanlış olabilirim), bu yüzden bir karakter dizeye nasıl dönüştürebilirim?
Bluefire

"yukarıdaki soruda," karakter "ile char veri türü demek istemiyorum" - Ben bunu bir char" kabul etmeyeceğim " olarak
okumuyorum

@Bluefire Cevabımı görün. Character.toStringçalışmalıdır (bu Charactersınıftan statik bir yöntemdir .
Ricardo Altamirano


5

charAtChar almama gereksiniminizle birleşen hibrit bir yaklaşım

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

Ama bu substring()dürüst olmaktan çok "daha temiz" değil .



4

İşte doğru kod. Zybooks kullanıyorsanız bu tüm sorunlara cevap verecektir.

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

0

birisi kotlin ile mücadele ederse, kod:

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

bu karakter 1 konumuna geri döner, bu durumda k hatırlayın, indeks 0 konumunda başlar, bu nedenle bu örnekte: kotlin k = konum 0, o = konum 1, t = konum 2, l = konum 3, i = konum 4 ve n = konum 5


-3

Bunun gibi:

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

OP belirtti Stringuzunluğu 1, arzu edilir değildir bir char.
William Price

Kabul edilenler de dahil olmak üzere diğer 6 cevap, charAt()olası bir çözüm olarak önerildi . Bu cevap ne ekliyor?
Dan Getz

6
Ayrıca, üçüncü konumda charAt()tek farklı karaktere sahip olarak 1 tabanlı endeksler kullanan ima ettiğiniz gibi görünüyor a. Eğer bu doğru olsaydı, bunu söylemeniz veya açıklamanız sizin için ipucu vermekten daha iyi olurdu. Gerçekte bu doğru değildir : charAt()0 tabanlı indeksler kullanır, öyle sde olur 'h'.
Dan Getz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.