Divida a string em uma série de strings de caracteres

113

Eu preciso dividir uma String em uma matriz de Strings de um único caractere.

Por exemplo, dividir "gato" resultaria na matriz "c", "a", "t"

Matt
fonte
3
Como uma referência rápida, "" .join (["c", "a", "t"]) para obter "gato" de volta.
shuva
2
Possível duplicata de Dividir palavras em letras em Java
Java 8: .split("")fará isso.
Amr Lotfy

Respostas:

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

Isso vai produzir

array ["c", "a", "t"]

coberty
fonte
8
Como e por quê? Este é um regex que significa qualquer caractere? Porque, em minha mente, da maneira como a divisão funciona, isso deve ser dividido apenas nos caracteres reais (,?,!, ^ E). No entanto, funciona como você diz.
Ty_
3
Esta é de fato uma expressão regex, chamada de lookahead negativo. Verifique
Erwin
4
@ EW-CodeMonkey (?!... )é 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.splitdocumentação diz "strings vazias não estão incluídas na matriz resultante".
Boann
8
Em Java 8 o comportamento de String.splitfoi 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.
Boann
1
Ele cria um array de uma string inteira.
Eduard
109
"cat".toCharArray()

Mas se você precisa de cordas

"cat".split("")

Editar: que retornará um primeiro valor vazio.

Yuriy Faktorovich
fonte
12
"cat" .split ("") retornaria [, c, a, t], não? Você terá um personagem extra em seu Array ...
recife
4
O "cat" .split ("") não funciona como esperado por Matt, você receberá uma String vazia extra => [, c, a, t].
recife de
5
Esta resposta agora funciona se você estiver usando Java 8. Consulte stackoverflow.com/a/22718904/1587046
Alexis C.
4
Esta foi uma mudança horrível em jdk8 porque eu confiei em split ("") e fiz soluções alternativas para este primeiro índice vazio. Agora, depois de atualizar para o java8, ele funciona como eu esperava anos atrás. infelizmente agora minha solução alternativa quebra meu código ... ggrrrr.
Marc,
@Marc Você provavelmente deveria estar usando de .toCharArray()qualquer maneira; ele evita regex e retorna uma matriz de charprimitivas, então é mais rápido e leve. É estranho precisar de uma matriz de strings de 1 caractere .
Boann
41
String str = "cat";
char[] cArray = str.toCharArray();
Raman
fonte
3
Nitpicking, a pergunta original pede um array de String, não um array de Char. No entanto, é muito fácil obter um array de String daqui.
dsolimano
Sim, eu já sei como obter uma variedade de caracteres. Posso apenas iterar pelo array char e criar uma string de cada um, se não houver outra maneira.
Matt,
Como você converteria de cArrayvolta para String?
Bitmap de
A sintaxe correta seria: char [] cArray = str.ToCharArray ();
dbz
6

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

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 charem 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 toCharArraytem que copiar os caracteres para uma nova matriz.

Stephen C
fonte
2

Para resumir as outras respostas ...

Isso funciona em todas as versões do Java:

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

Isso só funciona no Java 8 e superior:

"cat".split("")
Lezorte
fonte
0

Talvez você possa usar um loop for que atravessa o conteúdo da String e extrair caracteres por caracteres usando o charAtmétodo.

Combinado com um, ArrayList<String>por exemplo, você pode obter seu conjunto de caracteres individuais.

recife
fonte
Talvez você pudesse ficar em uma perna e cantar "God Save the Queen". Desculpe, mas isso não está nem perto de ser correto.
Stephen C
0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
JV More
fonte
1
Tem certeza de que isso vai dividir uma string em um array? Você está apenas imprimindo a string na tela.
TDG de
0

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

split("(?!^)")não funciona corretamente se a string contiver pares substitutos. Você deve usar split("(?<=.)").

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

resultado:

[花, a, b, 🌹, 🌺, 🌷]
saka1029
fonte
0

O operador spread [ ...] cria uma matriz com cada caractere na string:

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

console.log(arrayized);

MHS
fonte