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