Ich muss einen String in ein Array von Strings mit nur einem Zeichen aufteilen.
Wenn Sie beispielsweise "cat" teilen, erhalten Sie das Array "c", "a", "t".
.split("")
wird es tun.
Ich muss einen String in ein Array von Strings mit nur einem Zeichen aufteilen.
Wenn Sie beispielsweise "cat" teilen, erhalten Sie das Array "c", "a", "t".
.split("")
wird es tun.
Antworten:
"cat".split("(?!^)")
Dies wird produzieren
Array ["c", "a", "t"]
(?!
... )
ist eine Regex-Syntax für eine negative Behauptung - es wird behauptet, dass es keine Übereinstimmung mit dem gibt, was darin enthalten ist. Und ^
stimmt mit dem Anfang der Zeichenfolge überein, sodass der reguläre Ausdruck an jeder Position übereinstimmt, die nicht der Anfang der Zeichenfolge ist, und fügt dort einen Split ein. Dieser reguläre Ausdruck stimmt auch am Ende der Zeichenfolge überein und würde daher auch eine leere Zeichenfolge an das Ergebnis anhängen, mit der Ausnahme, dass in der String.split
Dokumentation angegeben wird, dass "nachfolgende leere Zeichenfolgen nicht im resultierenden Array enthalten sind".
String.split
geringfügig geändert, sodass führende leere Zeichenfolgen, die durch eine Übereinstimmung mit der Breite Null erzeugt wurden, ebenfalls nicht im Ergebnisarray enthalten sind. Daher wird die (?!^)
Behauptung, dass die Position nicht der Anfang der Zeichenfolge ist, unnötig, sodass der reguläre Ausdruck dies zulässt zu nichts vereinfacht werden - "cat".split("")
- aber in Java 7 und darunter erzeugt dies eine führende leere Zeichenfolge im Ergebnisarray.
"cat".toCharArray()
Aber wenn Sie Strings brauchen
"cat".split("")
Bearbeiten: Gibt einen leeren ersten Wert zurück.
.toCharArray()
sowieso verwenden; Es vermeidet Regex und gibt eine Reihe von char
Grundelementen zurück, sodass es schneller und leichter ist. Es ist seltsam, ein Array von Zeichenfolgen mit 1 Zeichen zu benötigen .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
zurück String
?
Wenn bei der Eingabe Zeichen außerhalb der mehrsprachigen Basisebene erwartet werden (einige CJK-Zeichen, neues Emoji ...), können Ansätze wie "a💫b".split("(?!^)")
diese nicht verwendet werden, da sie solche Zeichen aufteilen (Ergebnisse in array ["a", "?", "?", "b"]
) und etwas Sichereres verwendet werden muss:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Eine effiziente Möglichkeit, einen String in ein Array von Strings mit einem Zeichen umzuwandeln, besteht darin, Folgendes zu tun:
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 a char
in a String
tatsächlich die Hälfte eines Unicode-Codepunkts darstellen könnte. (Wenn sich der Codepunkt nicht im BMP befindet.) Um damit umzugehen, müssen Sie die Codepunkte durchlaufen ... was komplizierter ist.
Dieser Ansatz ist schneller als die Verwendung 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
muss die Zeichen in ein neues Array kopieren .
Möglicherweise können Sie eine for-Schleife verwenden, die den String-Inhalt durchläuft und mithilfe der charAt
Methode Zeichen für Zeichen extrahiert .
In Kombination mit einem ArrayList<String>
können Sie beispielsweise eine Reihe einzelner Zeichen erhalten.
Wenn die ursprüngliche Zeichenfolge zusätzliche Unicode-Zeichen enthält , split()
funktioniert dies nicht, da diese Zeichen in Ersatzpaare aufgeteilt werden. Um diese Sonderzeichen richtig zu behandeln, funktioniert ein Code wie dieser:
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);
}