2011-03-08 20 views
83

Necesito dividir una cadena en una matriz de cadenas de un solo carácter.Separar cadena en una matriz de cadenas de caracteres

Por ejemplo, la división "gato" daría la matriz "c", "a", "t"

+2

http://stackoverflow.com/questions/1521921/splitting-words-into-letters-in-java – birryree

+1

A modo de referencia, "".join (["c", "a", "t"]) para recuperar "cat". – shuva

Respuesta

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

Esto producirá

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

+6

¿Cómo y por qué? ¿Es esto una expresión regular que significa cualquier personaje? Porque en mi opinión, con la forma en que funciona la división, esto debería dividirse solo en los caracteres reales (,?,!, ^, Y). Sin embargo, funciona como dices. – TyP

+2

Esto es de hecho una expresión de expresiones regulares, llamada búsqueda anticipada negativa. Consulte la documentación aquí: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum – Erwin

+1

@ EW-CodeMonkey '(?!' ... ')' es la sintaxis regex para una afirmación negativa - afirma que no hay coincidencia de lo que hay dentro de ella. Y '^' coincide con el comienzo de la cadena, por lo que la expresión regular coincide en cada posición que * no * es el comienzo de la cadena, e inserta una división allí. Esta expresión regular también coincide al final de la cadena y, por lo tanto, también agregaría una cadena vacía al resultado, excepto que la documentación 'String.split' [dice] (https://docs.oracle.com/javase/8/docs /api/java/lang/String.html#split-java.lang.String-) "las cadenas vacías finales no están incluidas en la matriz resultante". – Boann

34
String str = "cat"; 
char[] cArray = str.toCharArray(); 
+0

+1 pero OP probablemente quiere una matriz de Cadena. –

+3

Nitpicking, la pregunta original pide una matriz de String, no una matriz de Char. Sin embargo, es bastante fácil obtener una matriz de String desde aquí. – dsolimano

+0

Sí, ya sé cómo obtener una serie de caracteres. Puedo iterar a través de la matriz de caracteres y crear una cadena de cada uno, si no hay otra forma. – Matt

-1

Tal vez usted puede utilizar un bucle que pasa por el contenido de la cadena y extraer caracteres de caracteres usando el método charAt.

Combinado con un ArrayList<String> por ejemplo, puede obtener su matriz de caracteres individuales.

+0

Tal vez podrías pararte sobre una pierna y cantar "God Save the Queen". Lo siento, pero esto ni siquiera está cerca de ser correcto. –

4

Eche un vistazo al método getChars() de la clase String.

+1

Demasiado complicado. Las otras respuestas tienen soluciones mucho más simples –

81
"cat".toCharArray() 

pero si necesita cadenas

"cat".split("") 

Editar: que devolverán un primer valor de vacío.

+8

"cat" .split ("") devolvería [, c, a, t], ¿no? Tendrás un personaje extra en tu Matriz ... – reef

+3

El "cat" .split ("") no funciona como esperaba Matt, obtendrás un String vacío adicional => [, c, a, t]. – reef

+5

Esta respuesta funciona ahora si está utilizando Java 8. Consulte http://stackoverflow.com/a/22718904/1587046 –

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

Explica por qué esto funcionaría. – Phiter

+1

¿Estás seguro de que esto dividirá una cadena en una matriz? Simplemente está imprimiendo la cadena a la pantalla. – TDG

1

Una forma eficiente de convertir una cadena en una matriz de cadenas de un carácter sería hacer esto:

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

Sin embargo, esto no tiene en cuenta el hecho de que un char en un String podría representar la mitad de un punto de código Unicode. (Si el punto de código no está en el BMP). Para tratar con eso, necesita iterar a través de los puntos de código ... lo cual es más complicado.

Este enfoque será más rápido que usar String.split(/* clever regex*/), y probablemente sea más rápido que usar flujos Java 8+. Es probable rápido que esto:

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

porque tiene que toCharArray copia los caracteres a una nueva matriz.

1

Si se espera que los caracteres más allá Basic Multilingual Plane en la entrada (algunos caracteres CJK, nuevo emoji ...), se acerca como "ab".split("(?!^)") no se puede utilizar, ya que romper esos caracteres (resultados en array ["a", "?", "?", "b"]) y algo más seguro tiene que ser usado:

"ab".codePoints() 
    .mapToObj(cp -> new String(Character.toChars(cp))) 
    .toArray(size -> new String[size]); 
0

Para resumir las otras respuestas ...

Esto funciona en todas las versiones de Java:

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

Esto sólo funciona en Java 8 y hasta:

"cat".split("") 
Cuestiones relacionadas