wake-up-neo.net

Zeichenfolge in ein Array von Zeichenketten aufteilen

Ich muss einen String in ein Array von einzelnen Zeichenstrings aufteilen.

Das Aufteilen von "cat" würde beispielsweise das Array "c", "a", "t" ergeben.

93
Matt
"cat".split("(?!^)")

Das wird produzieren

array ["c", "a", "t"]

107
coberty
"cat".toCharArray()

Aber wenn Sie Fäden brauchen

"cat".split("")

Edit: Gibt einen leeren ersten Wert zurück.

94
String str = "cat";
char[] cArray = str.toCharArray();
36
Raman

Wenn bei der Eingabe Zeichen nach Basic Multilingual Plane erwartet werden (einige CJK-Zeichen, neue Emoji ...), können Ansätze wie "a????b".split("(?!^)") nicht verwendet werden, da sie solche Zeichen brechen (Ergebnisse in array ["a", "?", "?", "b"]) und etwas sicherer sein muss gebraucht:

"a????b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);
3
Jan Molnar

Um die anderen Antworten zusammenzufassen ...

Dies funktioniert auf allen Java-Versionen:

"cat".split("(?!^)")

Dies funktioniert nur unter Java 8 und höher:

"cat".split("")
2
Lezorte

Ein effizienter Weg, aus einem String ein Array aus Strings mit einem Zeichen zu machen, wäre dies:

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

Dies berücksichtigt jedoch nicht die Tatsache, dass eine char in einer String tatsächlich die Hälfte eines Unicode-Codepunkts darstellen könnte. (Wenn der Codepunkt nicht in der BMP enthalten ist.) Um damit umzugehen, müssen Sie die Codepunkte durchlaufen ... was komplizierter ist.

Diese Vorgehensweise ist schneller als die Verwendung von String.split(/* clever regex*/) und wahrscheinlich schneller als die Verwendung von Java 8+ -Streams. Es ist wahrscheinlich schneller als dies:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

weil toCharArray die Zeichen in ein neues Array kopieren muss.

1
Stephen C

Wenn die Originalzeichenfolge ergänzende Unicode-Zeichen enthält, funktioniert split() nicht, da diese Zeichen in Ersatzpaare aufgeteilt werden. Um diese Sonderzeichen richtig zu behandeln, funktioniert ein Code wie folgt:

String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
    int cp = stringToSplit.codePointAt(i);
    char c[] = Character.toChars(cp);
    chars[j] = new String(c);
    i += Character.charCount(cp);
}
0
Daniel Nitzan