Entonces quiero iterar para cada carácter en una cadena.
Así que pensé:
for (char c : "xyz")
pero me sale un error del compilador:
MyClass.java:20: foreach not applicable to expression type
¿Cómo puedo hacer esto?
La forma más fácil de cada uno charen cada Stringes usar toCharArray():
for (char ch: "xyz".toCharArray()) {
}
Esto le da la concisión de cada construcción, pero desafortunadamente String(que es inmutable) debe realizar una copia defensiva para generar char[](que es mutable), por lo que hay una penalización de costos.
De la documentación :
[
toCharArray()devuelve] una matriz de caracteres recientemente asignada cuya longitud es la longitud de esta cadena y cuyo contenido se inicializa para contener la secuencia de caracteres representada por esta cadena.
Hay formas más detalladas de iterar sobre los caracteres en una matriz (regular for loop CharacterIterator, etc.) pero si está dispuesto a pagar el costo toCharArray(), cada uno es el más conciso.
toCharArray( )se llama 3 veces?211900000, el tiempo necesario para completarfor (char c : str.toCharArray()) { }es ~ 250 ms y el tiempo necesario para completarfor (char c : charArray) { }es <10 ms. Por supuesto, estos valores de tiempo dependerán del hardware, pero la conclusión es que un método es significativamente costoso que el otro.toCharArray()no está dentro del cuerpo del bucle; solo se llama una vez, y luego el ciclo itera sobre esa matriz resultante. (El bucle for-each es diferente al bucle generalfor, que evalúa la condición de parada en cada iteración).fuente
Otra solución útil, puede trabajar con esta cadena como una matriz de cadenas
fuente
split()asigna a más de un carácter Java, como es el caso de casi todos los emoticones. Por ejemplo, esta variación de su ejemplo se repetirá cuatro veces en lugar de tres:for (String s : "x😁z".split("")) { System.out.println(s); }Debe convertir el objeto String en una matriz de caracteres utilizando el
toCharArraymétodo () de la clase String:fuente
En Java 8 podemos resolverlo como:
El método chars () devuelve un
IntStreamcomo se menciona en doc :¿Por qué usar
forEachOrderedy noforEach?El comportamiento de
forEaches explícitamente no determinista donde, a medida queforEachOrderedrealiza una acción para cada elemento de esta secuencia, en el orden de encuentro de la secuencia si la secuencia tiene un orden de encuentro definido. PorforEachlo tanto , no garantiza que se mantenga el pedido. También revise esta pregunta para más.También podríamos usar
codePoints()para imprimir, vea esta respuesta para más detalles.fuente
Desafortunadamente Java no hace
StringimplementarIterable<Character>. Esto podría hacerse fácilmente. HayStringCharacterIteratorpero eso ni siquiera se implementaIterator... Así que haga el suyo:Ahora puedes ejecutar (algo) fácilmente
for (char c : new CharSequenceCharacterIterable("xyz"))...fuente
Si usa Java 8, puede usarlo
chars()en aStringpara obtener un númeroStreamde caracteres, pero deberá convertir la parteintposterior en uncharcomochars()devuelve unIntStream.Si usa Java 8 con Eclipse Collections , puede usar la
CharAdapterclaseforEachmétodo de con una referencia lambda o método para iterar sobre todos los caracteres en aString.Este ejemplo particular también podría usar una referencia de método.
Nota: Soy un committer para Eclipse Collections.
fuente
También puede usar una lambda en este caso.
fuente
Para Travers an String también puede usar
charAt()con la cadena.me gusta :
charAt()es un método de manejo de cadenas en Java que ayuda a atravesar la cadena para un carácter específico.fuente
for (char st: "xyz".toCharArray()) {}es