web-dev-qa-db-fra.com

Fractionner une chaîne en un tableau de chaînes de caractères

Je dois diviser une chaîne en un tableau de chaînes à caractère unique.

Par exemple, diviser "cat" donnerait au tableau "c", "a", "t"

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

Cela produira

tableau ["c", "a", "t"]

107
coberty
"cat".toCharArray()

Mais si vous avez besoin de cordes

"cat".split("")

Edit: qui retournera une première valeur vide.

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

Si des caractères au-delà de Plan multilingue de base sont attendus en entrée (certains caractères CJK, nouveaux emoji ...), des approches telles que "a????b".split("(?!^)") ne peuvent pas être utilisées, car elles cassent ces caractères (résultats en array ["a", "?", "?", "b"]) et doivent être sécurisées. utilisé:

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

Pour résumer les autres réponses ...

Cela fonctionne sur toutes les versions de Java:

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

Cela ne fonctionne que sur Java 8 et supérieur:

"cat".split("")
2
Lezorte

Voici un moyen efficace de transformer une chaîne en un tableau de chaînes d'un caractère:

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

Cependant, cela ne tient pas compte du fait qu'une char dans une String pourrait en réalité représenter la moitié d'un point de code Unicode. (Si le point de code n'est pas dans le BMP.) Pour traiter cela, vous devez parcourir les points de code ... ce qui est plus compliqué.

Cette approche sera plus rapide que d'utiliser String.split(/* clever regex*/), et probablement plus rapide que d'utiliser des flux Java 8+. C'est probablement plus rapide que ça:

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

parce que toCharArray doit copier les caractères dans un nouveau tableau.

1
Stephen C

Si la chaîne d'origine contient caractères Unicode supplémentaires , alors split() ne fonctionnera pas, car il divise ces caractères en paires de substitution. Pour gérer correctement ces caractères spéciaux, un code comme celui-ci fonctionne:

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