Teilen Sie die Zeichenfolge in ein Array von Zeichenfolgen auf

111

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".

Matt
quelle
3
Als Kurzreferenz "" .join (["c", "a", "t"]), um "cat" zurückzubekommen.
Shuva
2
Mögliches Duplikat des
Java 8: .split("")wird es tun.
Amr Lotfy

Antworten:

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

Dies wird produzieren

Array ["c", "a", "t"]

coberty
quelle
8
Wie und warum? Bedeutet dies eine Regex, die ein Zeichen bedeutet? In meinen Augen sollte dies bei der Funktionsweise von split nur auf die tatsächlichen Zeichen (,?,!, ^ Und) aufgeteilt werden. Es funktioniert jedoch so, wie Sie es sagen.
Ty_
3
Dies ist in der Tat ein Regex-Ausdruck, der als negativer Lookahead bezeichnet wird. Überprüfen Sie die Dokumentation hier: docs.oracle.com/javase/6/docs/api/java/util/regex/…
Erwin
4
@ EW-CodeMonkey (?!... )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.splitDokumentation angegeben wird, dass "nachfolgende leere Zeichenfolgen nicht im resultierenden Array enthalten sind".
Boann
8
In Java 8 wurde das Verhalten von String.splitgeringfü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.
Boann
1
Es wird ein Array einer gesamten Zeichenfolge erstellt.
Eduard
109
"cat".toCharArray()

Aber wenn Sie Strings brauchen

"cat".split("")

Bearbeiten: Gibt einen leeren ersten Wert zurück.

Yuriy Faktorovich
quelle
12
"cat" .split ("") würde [, c, a, t] zurückgeben, nein? Sie werden einen zusätzlichen Charakter in Ihrem Array haben ...
Riff
4
Die "cat" .split ("") funktioniert nicht wie von Matt erwartet, Sie erhalten einen extra leeren String => [, c, a, t].
Riff
5
Diese Antwort funktioniert jetzt, wenn Sie Java 8 verwenden. Siehe stackoverflow.com/a/22718904/1587046
Alexis C.
4
Dies war eine schreckliche Änderung in jdk8, weil ich mich auf split ("") verlassen und Problemumgehungen für diesen albernen leeren ersten Index durchgeführt habe. Jetzt, nach dem Upgrade auf Java8, funktioniert es so, wie ich es vor Jahren erwartet hätte. Leider bricht jetzt meine Problemumgehung meinen Code ... ggrrrr.
Marc
@Marc Du solltest wahrscheinlich .toCharArray()sowieso verwenden; Es vermeidet Regex und gibt eine Reihe von charGrundelementen zurück, sodass es schneller und leichter ist. Es ist seltsam, ein Array von Zeichenfolgen mit 1 Zeichen zu benötigen .
Boann
41
String str = "cat";
char[] cArray = str.toCharArray();
Raman
quelle
3
Nitpicking, die ursprüngliche Frage fragt nach einem Array von String, nicht nach einem Array von Char. Es ist jedoch recht einfach, von hier aus ein Array von Strings zu erhalten.
Dsolimano
Ja, ich weiß bereits, wie man eine Reihe von Zeichen bekommt. Ich kann einfach durch das char-Array iterieren und aus jedem einen String erstellen, wenn es keinen anderen Weg gibt.
Matt
Wie würden Sie konvertieren cArrayzurück String?
Bitmap
Die korrekte Syntax wäre: char [] cArray = str.ToCharArray ();
dbz
6

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]);
Jan Molnar
quelle
2

Um die anderen Antworten zusammenzufassen ...

Dies funktioniert auf allen Java-Versionen:

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

Dies funktioniert nur unter Java 8 und höher:

"cat".split("")
Lezorte
quelle
1

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 charin a Stringtatsä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 toCharArraymuss die Zeichen in ein neues Array kopieren .

Stephen C.
quelle
0

Möglicherweise können Sie eine for-Schleife verwenden, die den String-Inhalt durchläuft und mithilfe der charAtMethode Zeichen für Zeichen extrahiert .

In Kombination mit einem ArrayList<String>können Sie beispielsweise eine Reihe einzelner Zeichen erhalten.

Riff
quelle
Vielleicht könntest du auf einem Bein stehen und "God Save the Queen" singen. Entschuldigung, aber das ist noch lange nicht richtig.
Stephen C
0

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);
}
Daniel Nitzan
quelle
0

split("(?!^)")funktioniert nicht richtig, wenn die Zeichenfolge Ersatzpaare enthält. Sie sollten verwenden split("(?<=.)").

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

Ausgabe:

[花, a, b, 🌹, 🌺, 🌷]
saka1029
quelle
-1
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
JV Mehr
quelle
1
Sind Sie sicher, dass dies einen String in ein Array aufteilen wird? Sie drucken nur die Zeichenfolge auf den Bildschirm.
TDG