Necesito dividir una cadena en una matriz de cadenas de un solo carácter.
Por ejemplo, dividir "gato" daría la matriz "c", "a", "t"
.split("")
lo hará.
Necesito dividir una cadena en una matriz de cadenas de un solo carácter.
Por ejemplo, dividir "gato" daría la matriz "c", "a", "t"
.split("")
lo hará.
Respuestas:
"cat".split("(?!^)")
Esto producirá
matriz ["c", "a", "t"]
(?!
... )
es una sintaxis de expresiones regulares para una aserción negativa: afirma que no hay coincidencia de lo que hay dentro. 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 String.split
documentación dice "las cadenas vacías finales no se incluyen en la matriz resultante".
String.split
se cambió ligeramente de modo que lleva cadenas vacías producidas por un partido de anchura cero tampoco están incluidos en el campo de resultados, por lo que la (?!^)
afirmación de que la posición no es el principio de la cadena se convierte en innecesaria, lo que permite la expresión regular a simplificarse a nada, "cat".split("")
pero en Java 7 y versiones posteriores, eso produce una cadena vacía inicial en la matriz de resultados.
"cat".toCharArray()
Pero si necesitas cuerdas
"cat".split("")
Editar: que devolverá un primer valor vacío.
.toCharArray()
todos modos; evita las expresiones regulares y devuelve una serie de char
primitivas para que sea más rápido y ligero. Es extraño necesitar una matriz de cadenas de 1 carácter .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
nuevo String
?
Si se esperan caracteres más allá del plano multilingüe básico en la entrada (algunos caracteres CJK, nuevos emoji ...), "a💫b".split("(?!^)")
no se pueden usar enfoques como , porque dividen dichos caracteres (resultados en array ["a", "?", "?", "b"]
) y se debe usar algo más seguro:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
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 a char
en a 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 lidiar 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 usarlo String.split(/* clever regex*/)
, y probablemente será más rápido que usar flujos de Java 8+. Es probable que sea más rápido que esto:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
porque toCharArray
tiene que copiar los caracteres a una nueva matriz.
Tal vez pueda usar un bucle for que recorra el contenido de String y extraiga caracteres por caracteres usando el charAt
método.
Combinado con, ArrayList<String>
por ejemplo, puede obtener su matriz de caracteres individuales.
Si la cadena original contiene caracteres Unicode suplementarios , entonces split()
no funcionaría, ya que divide estos caracteres en pares sustitutos. Para manejar correctamente estos caracteres especiales, un 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);
}
El operador de propagación [ ...
] crea una matriz con cada carácter de la cadena:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);