2012-06-27 27 views
150

Dizede belirli bir karakter veya sayı dizininin nasıl çalıştığını biliyorum, ancak nth konumunda bana karakter vermek için kullanabileceğim önceden tanımlanmış bir yöntem var mı? Yani "foo" dizesinde, indeksi 0 olan karakter için sordum, "f" dönecekti.Dize ile karakter dizisi alın - Java

Not - yukarıdaki soruya, "karakter" ile char veri türünü değil, bir dizgedeki harf veya sayıyı kastetmiyorum. Burada önemli olan, yöntem çağrıldığında bir char alamıyorum, ancak bir string (uzunluk 1). Ve substring() yöntemini biliyorum, ama daha iyi bir yol olup olmadığını merak ediyordum.

+2

Bu çok garip bir sorudur. – user845279

+9

Bu nedir? Cevap oldukça basittir. – ametren

+0

Bir "char" değeri istemediğini fark ettiniz mi? Ve substring() 'nin nasıl yapılacağını bilir, ancak sadece" neat "bir yöntem ister. Bilginize şunu söyleyebilirim: 'substring()' en düzgün yoldur. – user845279

cevap

233

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

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

fazla bilgi için, Java documentation on String.charAt bakın. Başka bir basit öğretici, this one veya this one istiyorsanız.

Bir char veri türü olarak sonucu istemiyoruz, bunun yerine bir dize olarak siz Character.toString yöntemi kullanmak istiyorsanız: Eğer Character sınıf ve toString hakkında daha fazla bilgi istiyorsanız

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

yöntem, benim bilgi the documentation on Character.toString dan çekti.

+0

"Burada önemli olan, yöntem çağrıldığında bir char alamıyorum, ancak bir dize", ancak yine de teşekkürler (yükseltme): D – Bluefire

+1

@Bluefire Düzenleme bölümüne bakın. –

+0

Bence Sylvain Leroux'un cevabı daha iyi. [Karakter hakkında belge] (https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#unicode) –

33

istiyorsun .charAt()

Here's a tutorial

"mystring".charAt(2) 

döner bir dizeye bir char dönüştürmek için birkaç yolu vardır bir dize sahip üzerinde hellbent iseniz s

:

Veya

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

Veya Örneğin bile

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

.

+0

Sanırım sorunun bir bölümünü okudunuz. – user845279

+0

Yanıt Güncellendi. – ametren

+0

@ametren "Karakter.toString" seçeneğine tercih edilen dize dizgisi birleştirme mi? –

7

Gereksinimlerinize göre substring() ile takıldınız. Standart yol charAt() olur, ancak bir char veri türü kabul etmeyeceğinizi söylemiştiniz.

+0

Yeterince adil. Fakat, char, ilkel bir tür olduğu için, toString() 'nin üzerinde çalışmayacağını ve' valueOf() 'ın sadece rakamlar olduğunu (sanırım yanılıyor olabilirim) farz edersiniz, o zaman nasıl bir char dönüştürürüm? bir dizeye – Bluefire

+0

"Yukarıdaki soruya göre," karakter "ile char veri tipini kastetmiyorum" - Bunu "char 'kabul etmeyeceğim" şeklinde okumuştum – ametren

+0

@Bluefire Cevabımıma bakın. 'Character.toString' çalışması gerekir (['Character']' dan (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html) sınıfından statik bir yöntemdir. –

4

kömürü almıyor sizin şartı ile charAt birleştiren melez bir yaklaşım

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

olabilir Ama bu substring() daha gerçekten "neater" dürüst olmak değil.

5

O kadar basittir olarak: Bunun gibi

String charIs = string.charAt(index) + ""; 
-3

: Önerilen cevapların

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

OP, bir "String" uzunluk 1'in istendiğini, ** değil "char" olduğunu belirtmiştir. –

+0

Kabul edilen biri dahil olmak üzere 6 diğer cevap, olası bir çözüm olarak 'charAt() 'önerdi. add? –

+5

Ayrıca, "charAt()", üçüncü konumda "a" tek farklı karaktere sahip olarak, 1 tabanlı indisleri kullandığını ima ediyor gibi görünüyor. Bu doğruysa, o zaman daha iyi olurdu. Bunu ima etmekten ya da açıklamaktan başka bir şey söyleyemezsiniz.Gerçekte bu * değil * doğru: 'charAt()' 0-tabanlı indisleri kullanır, bu yüzden '' '' 'h'' olacaktır. –

3

Yok Unicode Basic Multiligual Plane dışında karakterleri kodlamak için kullanılan vekil çiftleri için çalışır.

İşte bir dize (KDV. Kullanarak Java 8 akışı API) "karakterlerini" üzerinde yineleme için üç farklı teknikler kullanılarak bir örnektir. Lütfen bu örnekte Unicode Ek Çok Dilli Düzlem (SMP) karakterlerini içerdiğini unutmayın. Bu örneği ve sonucu doğru şekilde görüntülemek için uygun bir yazı tipine ihtiyacınız var. karakter

ilk çözüm ait

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

Bıkmadan dizesinin tüm char üzerinde basit bir döngü: Kod noktalarının

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

yineleme

ikinci çözüm açık bir döngü kullanır Ayrıca, kod noktalarına codePointAt ile erişme ve döngü dizinini 012'ye göre arttırma: Java 8 Stream API üçüncü çözelti esas olarak ikinci aynı olan Akış API

kullanılarak, fakat kod noktaları üzerinde

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

yineleme:

/* 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ırırsanız aşağıdakileri elde edersiniz:

(Düzgün hiyeroglif görüntülemek yapabileceklerse) Gördüğünüz gibi

, ilk çözüm Unicode BMP dışında düzgün karakterleri işlemez. Diğer taraftan, diğer iki çözüm, vekil çiftlerle iyi anlaşır.

0

İşte doğru kod. Eğer zybooks kullanıyorsanız, tüm problemleri çözecektir.

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