Suddividi la stringa in un array di stringhe di caratteri


Risposte:


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

Questo produrrà

matrice ["c", "a", "t"]


8
Come e perché? È una regex che significa un personaggio? Perché nella mia mente, con il modo in cui funziona la divisione, questa dovrebbe dividere solo sui caratteri effettivi (,?,!, ^ E). Tuttavia, funziona come dici tu.
Ty_

3
Questa è davvero un'espressione regex, chiamata lookahead negativo. Controlla
Erwin

4
@ EW-CodeMonkey (?!... )è la sintassi regex per un'asserzione negativa - afferma che non c'è corrispondenza di ciò che è al suo interno. E ^corrisponde all'inizio della stringa, quindi la regex trova ogni posizione che non è l'inizio della stringa e inserisce una divisione lì. Questa regex corrisponde anche alla fine della stringa e quindi aggiungerebbe anche una stringa vuota al risultato, tranne per il fatto che la String.splitdocumentazione dice "le stringhe vuote finali non sono incluse nell'array risultante".
Boann

8
In Java 8 il comportamento String.splitè stato leggermente modificato in modo che conduce stringhe vuote prodotte da una corrispondenza di ampiezza zero, inoltre, non sono incluse nella matrice risultato, quindi l' (?!^)affermazione che la posizione non è l'inizio della stringa diventa inutile, permettendo regex per essere semplificato a nulla - "cat".split("")- ma in Java 7 e versioni precedenti ciò produce una stringa vuota iniziale nell'array dei risultati.
Boann

1
Crea un array di un'intera stringa.
Eduard

109
"cat".toCharArray()

Ma se hai bisogno di stringhe

"cat".split("")

Modifica: che restituirà un primo valore vuoto.


12
"cat" .split ("") restituisce [, c, a, t], no? Avrai un personaggio in più nel tuo Array ...
reef

4
Il "gatto" .split ("") non funziona come previsto da Matt, otterrai una stringa vuota extra => [, c, a, t].
barriera corallina

5
Questa risposta ora funziona se stai usando Java 8. Vedi stackoverflow.com/a/22718904/1587046
Alexis C.

4
Questo è stato un cambiamento orribile in jdk8 perché ho fatto affidamento su split ("") e ho fatto delle soluzioni alternative a causa di questo stupido primo indice vuoto. Ora, dopo l'aggiornamento a java8, funziona come mi sarei aspettato anni fa. sfortunatamente ora la mia soluzione alternativa rompe il mio codice ... ggrrrr.
Marc

@Marc Probabilmente dovresti usarlo .toCharArray()comunque; evita regex e restituisce un array di charprimitive quindi è più veloce e leggero. È strano aver bisogno di un array di stringhe di 1 carattere .
Boann

41
String str = "cat";
char[] cArray = str.toCharArray();

3
Nitpicking, la domanda originale richiede un array di String, non un array di Char. Tuttavia è abbastanza facile ottenere un array di String da qui.
dsolimano

Sì, so già come ottenere una serie di caratteri. Posso semplicemente iterare attraverso l'array char e creare una stringa da ciascuno, se non c'è altro modo.
Matt

Come si convertire cArraytorna a String?
Bitmap

La sintassi corretta sarebbe: char [] cArray = str.ToCharArray ();
dbz

6

Se nell'input sono previsti caratteri oltre il Piano multilingue di base (alcuni caratteri CJK, nuove emoji ...), approcci come "a💫b".split("(?!^)")non possono essere utilizzati, perché interrompono tali caratteri (risultati in array ["a", "?", "?", "b"]) e deve essere usato qualcosa di più sicuro:

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

2

Un modo efficiente per trasformare una stringa in un array di stringhe di un carattere sarebbe farlo:

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

Tuttavia, questo non tiene conto del fatto che a charin a Stringpotrebbe effettivamente rappresentare la metà di un punto di codice Unicode. (Se il punto di codice non è nel BMP.) Per affrontarlo è necessario scorrere i punti di codice ... il che è più complicato.

Questo approccio sarà più veloce rispetto all'utilizzo String.split(/* clever regex*/)e probabilmente sarà più veloce rispetto all'utilizzo di flussi Java 8+. È probabile più veloce di questo:

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

perché toCharArraydeve copiare i caratteri in un nuovo array.


2

Per riassumere le altre risposte ...

Funziona su tutte le versioni di Java:

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

Funziona solo su Java 8 e versioni successive:

"cat".split("")

0

Forse puoi usare un ciclo for che passa attraverso il contenuto della stringa ed estrae i caratteri per caratteri usando il charAtmetodo.

In combinazione con un, ArrayList<String>ad esempio, puoi ottenere il tuo array di singoli caratteri.


Forse potresti stare su una gamba sola e cantare "God Save the Queen". Mi dispiace, ma questo non è nemmeno vicino alla correzione.
Stephen C

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
Sei sicuro che questo dividerà una stringa in un array? Stai solo stampando la stringa sullo schermo.
TDG

0

Se la stringa originale contiene caratteri Unicode supplementari , split()non funzionerebbe, poiché divide questi caratteri in coppie surrogate. Per gestire correttamente questi caratteri speciali, un codice come questo funziona:

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

split("(?!^)")non funziona correttamente se la stringa contiene coppie surrogate. Dovresti usare split("(?<=.)").

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

produzione:

[花, a, b, 🌹, 🌺, 🌷]

0

L'operatore spread [ ...] crea un array con ogni carattere nella stringa:

const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];

console.log(arrayized);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.