¿Cómo aplico el bucle for-each a cada personaje en una cadena?

Así que quiero iterar para cada personaje en una cadena.

Así que pensé:

for (char c : "xyz") 

pero obtengo un error de comstackción:

 MyClass.java:20: foreach not applicable to expression type 

¿Cómo puedo hacer esto?

La forma más fácil de for-cada cada char en una String es usar toCharArray() :

 for (char ch: "xyz".toCharArray()) { } 

Esto le da la concisión de for-each constructo, pero desafortunadamente String (que es inmutable) debe realizar una copia defensiva para generar el char[] (que es mutable), por lo que hay una cierta penalización de costo.

De la documentación :

[ toCharArray() devuelve] una matriz de caracteres recién asignada cuya longitud es la longitud de esta cadena y cuyos contenidos se inicializan para contener la secuencia de caracteres representada por esta cadena.

Hay formas más detalladas de iterar sobre los caracteres en una matriz (regular para bucle, CharacterIterator , etc.) pero si está dispuesto a pagar el costo toCharArray() para cada una es la más concisa.

 String s = "xyz"; for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); } 

Necesita convertir el objeto String en una matriz de char utilizando el método toCharArray () de la clase String:

 String str = "xyz"; char arr[] = str.toCharArray(); // convert the String object to array of char // iterate over the array using the for-each loop. for(char c: arr){ System.out.println(c); } 

Otra solución útil, puedes trabajar con esta cadena como una matriz de String

 for (String s : "xyz".split("")) { System.out.println(s); } 

En Java 8 podemos resolverlo como:

 String str = "xyz"; str.chars().forEachOrdered(i -> System.out.print((char)i)); 

El método chars () devuelve un IntStream como se menciona en el documento :

Devuelve una secuencia de int extendiendo los valores de char de esta secuencia. Cualquier char que se asigna a un punto de código sustituto se pasa sin ser interpretado. Si la secuencia se muta mientras se lee la secuencia, el resultado no está definido.

¿Por qué usar forEachOrdered y no forEach ?

El comportamiento de forEach es explícitamente no determinista cuando, como forEachOrdered realiza una acción para cada elemento de esta secuencia, en el orden de encuentro de la secuencia si la secuencia tiene una orden de encuentro definida. Entonces, forEach no garantiza que la orden se mantendrá. También verifique esta pregunta para más.

También podríamos usar codePoints() para imprimir, vea esta respuesta para más detalles.

Si usa Java 8, puede usar chars() en una String para obtener una Stream de caracteres, pero deberá volver a convertir el int en una char ya que chars() devuelve una IntStream .

 "xyz".chars().forEach(i -> System.out.print((char)i)); 

Si utiliza Java 8 con colecciones de Eclipse , puede usar la clase forEach para forEach método con una referencia lambda o de método para iterar sobre todos los caracteres de una String .

 CharAdapter.adapt("xyz").forEach(c -> System.out.print(c)); 

Este ejemplo particular también podría usar una referencia de método.

 CharAdapter.adapt("xyz").forEach(System.out::print) 

Nota: soy un committer para las colecciones de Eclipse.

También puedes usar un lambda en este caso.

  String s = "xyz"; IntStream.range(0, s.length()).forEach(i -> { char c = s.charAt(i); }); 

Para Travers an String también puede usar charAt() con la cadena.

me gusta :

 String str = "xyz"; // given String char st = str.charAt(0); // for example we take 0 index element System.out.println(st); // print the char at 0 index 

charAt() es el método de manejo de cadenas en java que ayuda a Travers la cadena para caracteres específicos.