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

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

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

for (char c : "xyz")

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

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

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

Ответ 1

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

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

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

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

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

Есть более подробные способы итерации над символами в массиве (регулярные для цикла, CharacterIterator и т.д.), но если вы готовы оплатить стоимость toCharArray() для каждого из них, это будет наиболее кратким.

Ответ 2

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

 

Ответ 3

Вам необходимо преобразовать объект 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

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

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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

К сожалению, Java не позволяет String реализовывать Iterable<Character>. Это можно легко сделать. Существует StringCharacterIterator, но он даже не реализует Iterator... Так что сделайте свое собственное:

public class CharSequenceCharacterIterable implements Iterable<Character> {
    private CharSequence cs;

    public CharSequenceCharacterIterable(CharSequence cs) {
        this.cs = cs;
    }

    @Override
    public Iterator<Character> iterator() {
        return new Iterator<Character>() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index < cs.length();
            }

            @Override
            public Character next() {
                return cs.charAt(index++);
            }
        };
    }
}

Теперь вы можете (несколько) легко запустить for (char c : new CharSequenceCharacterIterable("xyz"))...

Ответ 7

Если вы используете Java 8, вы можете использовать chars() на String, чтобы получить символ Stream, но вам нужно будет вернуть int в char, поскольку chars() возвращает a 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.

Ответ 8

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

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

Ответ 9

Для Travers the String вы также можете использовать charAt() со строкой.

like:

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