J'ai besoin de diviser une chaîne en un tableau de chaînes à un seul caractère.
Par exemple, diviser "cat" donnerait le tableau "c", "a", "t"
.split("")
fera.
J'ai besoin de diviser une chaîne en un tableau de chaînes à un seul caractère.
Par exemple, diviser "cat" donnerait le tableau "c", "a", "t"
.split("")
fera.
Réponses:
"cat".split("(?!^)")
Cela produira
tableau ["c", "a", "t"]
(?!
... )
est une syntaxe regex pour une assertion négative - elle affirme qu'il n'y a pas de correspondance avec ce qu'il contient . Et ^
correspond au début de la chaîne, de sorte que l'expression régulière correspond à chaque position qui n'est pas le début de la chaîne, et y insère une division. Cette expression régulière correspond également à la fin de la chaîne et ajouterait donc une chaîne vide au résultat, sauf que la String.split
documentation dit que "les chaînes vides de fin ne sont pas incluses dans le tableau résultant".
String.split
a été légèrement modifiée afin que leader des chaînes vides produites par un match nul largeur ne sont pas inclus aussi dans le tableau de résultat, de sorte que l' (?!^)
affirmation selon laquelle la position n'est pas le début de la chaîne devient inutile, ce qui permet l'expression rationnelle être simplifié à rien - "cat".split("")
- mais dans Java 7 et les versions antérieures, cela produit une chaîne vide de début dans le tableau de résultats.
"cat".toCharArray()
Mais si vous avez besoin de chaînes
"cat".split("")
Edit: qui renverra une première valeur vide.
.toCharArray()
toute façon; il évite les regex et renvoie un tableau de char
primitives donc c'est plus rapide et plus léger. Il est étrange d'avoir besoin d'un tableau de chaînes à 1 caractère .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
revenir à String
?
Si des caractères au-delà du plan multilingue de base sont attendus en entrée (certains caractères CJK, de 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 quelque chose de plus sûr doit être utilisé:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Un moyen efficace de transformer une chaîne en un tableau de chaînes à un caractère serait de faire ceci:
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 que a char
dans a String
pourrait en fait représenter la moitié d'un point de code Unicode. (Si le point de code n'est pas dans le BMP.) Pour gérer cela, vous devez parcourir les points de code ... ce qui est plus compliqué.
Cette approche sera plus rapide que l'utilisation String.split(/* clever regex*/)
, et ce sera probablement plus rapide que l'utilisation des flux Java 8+. C'est probablement plus rapide que cela:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
car toCharArray
doit copier les caractères dans un nouveau tableau.
Vous pouvez peut-être utiliser une boucle for qui parcourt le contenu String et extraire les caractères par caractères à l'aide de la charAt
méthode.
Combiné avec un ArrayList<String>
par exemple, vous pouvez obtenir votre tableau de caractères individuels.
Si la chaîne d'origine contient des caractères Unicode supplémentaires , split()
cela ne fonctionnera pas, car elle 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);
}
L'opérateur de diffusion [ ...
] crée un tableau avec chaque caractère de la chaîne:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);