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 char
en cada String
es 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
toCharArray
método () de la clase String:fuente
En Java 8 podemos resolverlo como:
El método chars () devuelve un
IntStream
como se menciona en doc :¿Por qué usar
forEachOrdered
y noforEach
?El comportamiento de
forEach
es explícitamente no determinista donde, a medida queforEachOrdered
realiza 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. PorforEach
lo 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
String
implementarIterable<Character>
. Esto podría hacerse fácilmente. HayStringCharacterIterator
pero 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 aString
para obtener un númeroStream
de caracteres, pero deberá convertir la parteint
posterior en unchar
comochars()
devuelve unIntStream
.Si usa Java 8 con Eclipse Collections , puede usar la
CharAdapter
claseforEach
mé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