Как применить цикл for-each к каждому символу в строке?

поэтому я хочу выполнить итерацию для каждого символа в строке.

Итак, я подумал:

for (char c : "xyz")

но я получаю ошибку компилятора:

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

Как я могу это сделать?

8 ответов


самый простой способ для каждого char на String использовать toCharArray():

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

это дает вам краткость для каждой конструкции, но, к сожалению String (который является неизменяемым) должен выполнить защитную копию для создания char[] (который является изменяемым), поэтому есть некоторый штраф за затраты.

С документация:

[toCharArray() возвращает] недавно выделенный массив символов длина которого длина этой строки и содержимое которой инициализируется, чтобы содержать последовательность символов, представленную этой строкой.

есть более подробные способы перебора символов в массиве (обычный для цикла,CharacterIterator и т. д.) Но если вы готовы оплатить стоимость toCharArray() для-Каждый является наиболее кратким.


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


вам нужно преобразовать объект String в массив символов, используя toCharArray() метод класса 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);
}

еще одно полезное решение, вы можете работать с этой строкой как массив String

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

на Java 8 мы можем решить это так:

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

метод chars () возвращает IntStream как говорится в doc:

возвращает поток int zero-расширение значений char из этого последовательность. Передается любой символ, который сопоставляется с суррогатной кодовой точкой через неинтерпретируемых. Если последовательность мутирована, а поток при чтении результат не определен.

зачем использовать forEachOrdered и не forEach ?

поведение forEach явно недетерминирован, где как forEachOrdered выполнить действие для каждого элемента этого потока, в встречайте порядок потока если поток имеет определенный порядок встречи. Так что forEach не гарантирует, что заказ будет храниться. Также проверьте это вопрос дополнительные.

мы могли бы также использовать codePoints() чтобы распечатать, см. Это ответ для получения более подробной информации.


если вы используете Java 8, вы можете использовать chars() на String и Stream символов, но вам нужно будет бросить int обратно в char as chars() возвращает IntStream.

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

если вы используете Java 8 с Коллекции Eclipse можно использовать CharAdapter класс forEach метод со ссылкой на лямбда-код или метод для итерации по всем символам в String.

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

этот конкретный пример также может использовать метод ссылка.

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

Примечание: я коммиттер для коллекций Eclipse.


в этом случае вы также можете использовать лямбду.

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

для Travers строка, которую вы также можете использовать charAt() С строку.

как :

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() - Это метод обработки строк в java, который помогает траверсу строки для определенного символа.