Как применить цикл for-each к каждому символу в строке? - PullRequest
166 голосов
/ 16 марта 2010

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

Вот я и подумал:

for (char c : "xyz")

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

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

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

Ответы [ 8 ]

300 голосов
/ 16 марта 2010

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

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

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

Из документации :

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

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

39 голосов
/ 16 марта 2010
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
   char c = s.charAt(i);
}

6 голосов
/ 16 марта 2010

Вам необходимо преобразовать объект String в массив char, используя метод 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);
}
4 голосов
/ 10 декабря 2017

В Java 8 мы можем решить его следующим образом:

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

Метод chars () возвращает IntStream, как указано в doc :

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

Почему используется forEachOrdered, а не forEach?

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

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

4 голосов
/ 19 июня 2017

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

for (String s : "xyz".split("")) {
    System.out.println(s);
}
2 голосов
/ 23 июня 2017

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

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

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

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

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

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

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

1 голос
/ 29 ноября 2017

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

    String s = "xyz";
    IntStream.range(0, s.length()).forEach(i -> {
        char c = s.charAt(i);
    });
0 голосов
/ 03 апреля 2013

Для Travers a String вы также можете использовать 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, который помогает Обходить строку для конкретного символа.

...