Zeichenfolge nach Index abrufen - Java

229

Ich weiß, wie man den Index eines bestimmten Zeichens oder einer bestimmten Zahl in einer Zeichenfolge berechnet, aber gibt es eine vordefinierte Methode, mit der ich mir das Zeichen an der n-ten Position geben kann? Wenn ich also in der Zeichenfolge "foo" nach dem Zeichen mit dem Index 0 frage, wird "f" zurückgegeben.

Hinweis - In der obigen Frage meine ich mit "Zeichen" nicht den Datentyp "Zeichen", sondern einen Buchstaben oder eine Zahl in einer Zeichenfolge. Wichtig hierbei ist, dass ich beim Aufrufen der Methode kein Zeichen erhalte, sondern eine Zeichenfolge (Länge 1). Ich kenne die Methode substring (), habe mich aber gefragt, ob es einen besseren Weg gibt.

Blaues Feuer
quelle
13
Es ist? Die Antwort ist ziemlich einfach.
Ametren
Hast du bemerkt, dass er keinen charWert will ? Und er weiß, wie es geht, will substring()aber nur einen "ordentlicheren" Weg. Zu substring()Ihrer Information , ich kann sagen, dass dies der sauberste Weg ist.
user845279
3
@ user845279 Character.toStringerfüllt alle notwendigen Anforderungen und ist überhaupt nicht chaotisch.
Ricardo Altamirano
@pythonscript Ich stimme zu, aber es unterscheidet sich nicht wesentlich von der substring()direkten Verwendung .
user845279
1
Ich bin zu spät zu dieser Party, aber @RicardoAltamirano ist ein bisschen falsch. Der endIndex(zweite Parameter) von String.substring(int, int)ist ein exklusiver Index und löst keine Ausnahme aus index + 1, solange index < length()- was auch für das letzte Zeichen in der Zeichenfolge gilt.
William Price

Antworten:

338

Die Methode, die Sie suchen, ist charAt. Hier ist ein Beispiel:

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

Weitere Informationen finden Sie in der Java-Dokumentation zuString.charAt . Wenn Sie ein anderes einfaches Tutorial möchten, dieses oder dieses .

Wenn Sie das Ergebnis nicht als charDatentyp, sondern als Zeichenfolge verwenden möchten, verwenden Sie die folgende Character.toStringMethode:

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

Wenn Sie weitere Informationen zur CharacterKlasse und zur toStringMethode wünschen , habe ich meine Informationen aus der Dokumentation zu Character.toString abgerufen .

Ricardo Altamirano
quelle
1
"Das Wichtigste hier ist, dass ich beim Aufrufen der Methode kein Zeichen erhalte, sondern einen String", aber trotzdem danke (Gegenstimme): D
Bluefire
1
Ich denke, Sylvain Lerouxs Antwort ist besser. doc über Charakter
Chaojun Zhong
Ich stimme @ChaojunZhong zu. Dies ist eine geeignetere Antwort, da es nicht ratsam ist, charAt () zu verwenden, da Sie Probleme haben würden, wenn Sie Zeichen haben, die 2 Codeeinheiten benötigen.
Bpunzalan
43

Sie wollen .charAt()

Hier ist ein Tutorial

"mystring".charAt(2)

kehrt zurück s

Wenn Sie eine Zeichenfolge haben möchten, gibt es verschiedene Möglichkeiten, ein Zeichen in eine Zeichenfolge umzuwandeln:

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

Oder

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

Oder auch

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

Beispielsweise.

ametren
quelle
@ametren Ist eine String-String-Verkettung der vorzuziehen Character.toString?
Ricardo Altamirano
Ich denke, das kann auf persönliche Vorlieben zurückzuführen sein. Sie könnten auch tunString mychar = String.valueOf("mystring".charAt(2));
ametren
Meine persönliche Präferenz wäre in diesem Fall, String mychar = ""+"mystring".charAt(2);weil es am prägnantesten ist. Andere werden sich in ihrer Meinung dazu unterscheiden.
Ametren
10

Keine der vorgeschlagenen Antworten funktioniert für Ersatzpaare, die zum Codieren von Zeichen außerhalb der mehrsprachigen Unicode-Grundebene verwendet werden .

Hier ist ein Beispiel mit drei verschiedenen Techniken, um die "Zeichen" einer Zeichenfolge zu durchlaufen (einschließlich der Verwendung der Java 8-Stream-API). Bitte beachten Sie, dass dieses Beispiel Zeichen der Unicode Supplementary Multilingual Plane (SMP) enthält. Sie benötigen eine geeignete Schriftart, um dieses Beispiel und das Ergebnis korrekt anzuzeigen.

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

Iterieren von Zeichen

Die erste Lösung ist eine einfache Schleife über die gesamte charZeichenfolge:

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

Iterieren von Codepunkten

Die zweite Lösung verwendet ebenfalls eine explizite Schleife, greift jedoch mit codePointAt auf einzelne Codepunkte zu und erhöht den Schleifenindex entsprechend auf 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.
}

Durchlaufen Sie Codepunkte mithilfe der Stream-API

Die dritte Lösung ist im Grunde die gleiche wie die zweite, verwendet jedoch die 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
    });

Ergebnisse

Wenn Sie dieses Testprogramm ausführen, erhalten Sie:

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

Wie Sie sehen können (wenn Sie Hieroglyphen richtig anzeigen können), verarbeitet die erste Lösung Zeichen außerhalb des Unicode-BMP nicht richtig. Andererseits können die beiden anderen Lösungen gut mit Ersatzpaaren umgehen.

Sylvain Leroux
quelle
8

Sie sind substring()angesichts Ihrer Anforderungen ziemlich festgefahren . Der Standardweg wäre charAt(), aber Sie sagten, Sie würden keinen char-Datentyp akzeptieren.

Thomas
quelle
Meinetwegen. Da char ein primitiver Typ ist, gehe ich davon aus, dass toString()es nicht funktioniert und valueOf()nur für Zahlen gilt (ich glaube, ich kann mich irren). Wie konvertiere ich ein char in einen String?
Bluefire
"In der obigen Frage meine ich mit" Zeichen "nicht den char-Datentyp" - ich lese dies nicht als "Ich akzeptiere kein char"
ametren
@ Bluefire Siehe meine Antwort. Character.toStringsollte funktionieren (es ist eine statische Methode aus der CharacterKlasse.
Ricardo Altamirano
5

Ein hybrider Ansatz, der charAtmit Ihrer Anforderung kombiniert wird, kein Zeichen zu erhalten, könnte sein

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

Aber das ist nicht wirklich "ordentlicher" als substring()um ehrlich zu sein.

fvu
quelle
5

Es ist so einfach wie:

String charIs = string.charAt(index) + "";
Aqif Hamid
quelle
4

Hier ist der richtige Code. Wenn Sie Zybooks verwenden, werden alle Probleme beantwortet.

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

Wenn jemand mit Kotlin zu kämpfen hat, lautet der Code:

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

Dies gibt das Zeichen an Position 1 zurück. In diesem Fall beginnt k. Denken Sie daran, dass der Index an Position 0 beginnt. In diesem Beispiel wäre kotlin k = Position 0, o = Position 1, t = Position 2, l = Position 3, i = Position 4 und n = Position 5

Thiago Silva
quelle
-3

So was:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
Kadar Kabouya Kalo
quelle
OP gab an, dass a Stringder Länge 1 erwünscht ist, nicht a char.
William Price
Die 6 anderen Antworten, einschließlich der akzeptierten, wurden charAt()als mögliche Lösung vorgeschlagen. Was fügt diese Antwort hinzu?
Dan Getz
6
Es sieht auch so aus, als würden Sie andeuten, dass charAt()1-basierte Indizes verwendet werden, indem das einzige andere Zeichen an adritter Stelle steht. Wenn das wahr wäre, wäre es besser für Sie, das zu sagen oder zu erklären, als darauf hinzuweisen. In Wirklichkeit das ist nicht wahr: charAt()verwendet 0-basierte Indizes, so swird 'h'.
Dan Getz