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

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

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

for (char c : "xyz")

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

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

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

вопрос задан 16.03.2010
Lyndon White
12897 репутация

8 ответов


  • 266 рейтинг

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

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

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

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

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

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

    ответ дан polygenelubricants, с репутацией 273877, 16.03.2010
  • 35 рейтинг
    String s = "xyz";
    for(int i = 0; i < s.length(); i++)
    {
       char c = s.charAt(i);
    }
    
    ответ дан Matthew Flaschen, с репутацией 213715, 16.03.2010
  • 6 рейтинг

    Необходимо преобразовать объект 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);
    }
    
    ответ дан codaddict, с репутацией 337564, 16.03.2010
  • 4 рейтинг

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

    for (String s : "xyz".split("")) {
        System.out.println(s);
    }
    
    ответ дан kyxap, с репутацией 156, 19.06.2017
  • 2 рейтинг

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

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

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

    .

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

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

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

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

    ответ дан i_am_zero, с репутацией 10225, 10.12.2017
  • 1 рейтинг

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

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

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

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

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

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

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

    ответ дан Donald Raab, с репутацией 3976, 23.06.2017
  • 0 рейтинг

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

        String s = "xyz";
        IntStream.range(0, s.length()).forEach(i -> {
            char c = s.charAt(i);
        });
    
    ответ дан ander4y748, с репутацией 3, 29.11.2017
  • -6 рейтинг

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

    ответ дан user1690439, с репутацией 19, 3.04.2013