Eu preciso dividir uma String em uma matriz de Strings de um único caractere.
Por exemplo, dividir "gato" resultaria na matriz "c", "a", "t"
.split("")
fará isso.
Eu preciso dividir uma String em uma matriz de Strings de um único caractere.
Por exemplo, dividir "gato" resultaria na matriz "c", "a", "t"
.split("")
fará isso.
Respostas:
"cat".split("(?!^)")
Isso vai produzir
array ["c", "a", "t"]
(?!
... )
é a sintaxe regex para uma afirmação negativa - ela afirma que não há correspondência com o que está dentro dela. E ^
corresponde ao início da string, de modo que a regex corresponde a todas as posições que não sejam o início da string e insere uma divisão ali. Este regex também corresponde ao final da string e, portanto, também acrescentaria uma string vazia ao resultado, exceto que a String.split
documentação diz "strings vazias não estão incluídas na matriz resultante".
String.split
foi ligeiramente alterado para que conduz cadeias vazias produzidos por um jogo de largura zero também não são incluídos na matriz resultado, de modo a (?!^)
afirmação de que a posição não é o início da cadeia torna-se desnecessário, permitindo a expressão regular a ser simplificado para nada - "cat".split("")
- mas no Java 7 e abaixo isso produz uma string vazia inicial na matriz de resultado.
"cat".toCharArray()
Mas se você precisa de cordas
"cat".split("")
Editar: que retornará um primeiro valor vazio.
.toCharArray()
qualquer maneira; ele evita regex e retorna uma matriz de char
primitivas, então é mais rápido e leve. É estranho precisar de uma matriz de strings de 1 caractere .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
volta para String
?
Se caracteres além do Plano Multilíngue Básico são esperados na entrada (alguns caracteres CJK, novo emoji ...), abordagens como "a💫b".split("(?!^)")
não podem ser usadas, porque quebram esses caracteres (resultados em array ["a", "?", "?", "b"]
) e algo mais seguro deve ser usado:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Uma maneira eficiente de transformar uma String em uma matriz de Strings de um caractere seria fazer o seguinte:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
No entanto, isso não leva em consideração o fato de que um char
em umString
pode realmente representar metade de um ponto de código Unicode. (Se o ponto de código não estiver no BMP.) Para lidar com isso, você precisa iterar pelos pontos de código ... o que é mais complicado.
Essa abordagem será mais rápida do que usar String.split(/* clever regex*/)
e provavelmente será mais rápida do que usar streams Java 8+. Provavelmente é mais rápido do que isso:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
porque toCharArray
tem que copiar os caracteres para uma nova matriz.
Talvez você possa usar um loop for que atravessa o conteúdo da String e extrair caracteres por caracteres usando o charAt
método.
Combinado com um, ArrayList<String>
por exemplo, você pode obter seu conjunto de caracteres individuais.
Se a string original contiver caracteres Unicode suplementares , split()
não funcionará, pois divide esses caracteres em pares substitutos. Para lidar corretamente com esses caracteres especiais, um código como este funciona:
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);
}
O operador spread [ ...
] cria uma matriz com cada caractere na string:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);