Devo dividere una stringa in una matrice di stringhe di un singolo carattere.
Ad esempio, la divisione "gatto" darebbe l'array "c", "a", "t"
.split("")lo farà.
Devo dividere una stringa in una matrice di stringhe di un singolo carattere.
Ad esempio, la divisione "gatto" darebbe l'array "c", "a", "t"
.split("")lo farà.
Risposte:
"cat".split("(?!^)")
Questo produrrà
matrice ["c", "a", "t"]
(?!... )è 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".
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.
"cat".toCharArray()
Ma se hai bisogno di stringhe
"cat".split("")
Modifica: che restituirà un primo valore vuoto.
.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 .
String str = "cat";
char[] cArray = str.toCharArray();
cArraytorna a String?
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]);
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.
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.
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);
}
L'operatore spread [ ...] crea un array con ogni carattere nella stringa:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);