Diviser la chaîne en tableau de chaînes de caractères

113

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"

Mat
la source
3
Comme référence rapide, "" .join (["c", "a", "t"]) pour récupérer "cat".
shuva
2
Java 8: le .split("")fera.
Amr Lotfy

Réponses:

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

Cela produira

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

coberty
la source
8
Comment et pourquoi? Est-ce une expression régulière qui signifie n'importe quel caractère? Parce que dans mon esprit, avec la façon dont fonctionne la division, cela ne devrait être divisé que sur les caractères réels (,?,!, ^ Et). Cependant, cela fonctionne comme vous le dites.
Ty_
3
C'est en effet une expression régulière, appelée une anticipation négative. Consultez
Erwin
4
@ EW-CodeMonkey (?!... )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.splitdocumentation dit que "les chaînes vides de fin ne sont pas incluses dans le tableau résultant".
Boann
8
En Java 8 le comportement String.splita é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.
Boann
1
Il crée un tableau d'une chaîne entière.
Eduard
109
"cat".toCharArray()

Mais si vous avez besoin de chaînes

"cat".split("")

Edit: qui renverra une première valeur vide.

Yuriy Faktorovich
la source
12
"cat" .split ("") renverrait [, c, a, t], non? Vous aurez un personnage supplémentaire dans votre Array ...
récif
4
Le "chat" .split ("") ne fonctionne pas comme prévu par Matt, vous obtiendrez un String vide supplémentaire => [, c, a, t].
récif
5
Cette réponse fonctionne maintenant si vous utilisez Java 8. Voir stackoverflow.com/a/22718904/1587046
Alexis C.
4
C'était un changement horrible dans jdk8 parce que je me suis appuyé sur la division ("") et que j'ai fait des solutions de contournement à cause de ce premier index vide idiot. Maintenant, après la mise à niveau vers java8, cela fonctionne comme je l'aurais prévu il y a des années. malheureusement maintenant ma solution de contournement casse mon code ... ggrrrr.
Marc
@Marc Vous devriez probablement utiliser de .toCharArray()toute façon; il évite les regex et renvoie un tableau de charprimitives donc c'est plus rapide et plus léger. Il est étrange d'avoir besoin d'un tableau de chaînes à 1 caractère .
Boann
41
String str = "cat";
char[] cArray = str.toCharArray();
Raman
la source
3
Nitpicking, la question d'origine demande un tableau de String, pas un tableau de Char. Cependant, il est assez facile d'obtenir un tableau de String à partir d'ici.
dsolimano
Ouais, je sais déjà comment obtenir un tableau de caractères. Je peux simplement parcourir le tableau char et créer une chaîne à partir de chacun, s'il n'y a pas d'autre moyen.
Matt
Comment voulez - vous convertir cArrayrevenir à String?
Bitmap
La syntaxe correcte serait: char [] cArray = str.ToCharArray ();
dbz
6

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

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 chardans a Stringpourrait 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 toCharArraydoit copier les caractères dans un nouveau tableau.

Stephen C
la source
2

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 plus:

"cat".split("")
Lezorte
la source
0

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 charAtméthode.

Combiné avec un ArrayList<String>par exemple, vous pouvez obtenir votre tableau de caractères individuels.

récif
la source
Peut-être pourriez-vous vous tenir sur une jambe et chanter "God Save the Queen". Désolé, mais ce n'est même pas près de corriger.
Stephen C
0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
JV Plus
la source
1
Êtes-vous sûr que cela va diviser une chaîne en un tableau? Vous imprimez simplement la chaîne à l'écran.
TDG
0

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

split("(?!^)")ne fonctionne pas correctement si la chaîne contient des paires de substitution. Vous devriez utiliser split("(?<=.)").

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

production:

[花, a, b, 🌹, 🌺, 🌷]
saka1029
la source
0

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);

MHS
la source