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


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

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

for (char c : "xyz")

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

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

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

8   147   2010-03-16 04:53:56

8 ответов:

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

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

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

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

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

есть более подробные способы перебора символов в массиве (обычный цикл for,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 ноль-расширение значений char из этого последовательность. Передается любой символ, который сопоставляется с суррогатной кодовой точкой через неинтерпретированный. Если последовательность мутировала во время потока при чтении результат не определен.

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

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

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

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

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