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"
"cat".split("(?!^)")
Cela produira
tableau ["c", "a", "t"]
"cat".toCharArray()
Mais si vous avez besoin de cordes
"cat".split("")
Edit: qui retournera une première valeur vide.
String str = "cat";
char[] cArray = str.toCharArray();
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]);
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("")
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.
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);
}