Итак, я хочу итерации для каждого символа в строке.
Итак, я подумал:
for (char c : "xyz")
но я получаю ошибку компилятора:
MyClass.java:20: foreach not applicable to expression type
Как я могу это сделать?
Итак, я хочу итерации для каждого символа в строке.
Итак, я подумал:
for (char c : "xyz")
но я получаю ошибку компилятора:
MyClass.java:20: foreach not applicable to expression type
Как я могу это сделать?
Самый простой способ для каждого из char
в String
- использовать toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Это дает вам краткость для каждой конструкции, но, к сожалению, String
(который является неизменным) должен выполнять защитную копию, чтобы сгенерировать char[]
(который является изменяемым), поэтому существует некоторое ограничение стоимости.
В документации :
[
toCharArray()
возвращает] новый выделенный массив символов, длина которого является длиной этой строки и содержимое которой инициализируется, чтобы содержать последовательность символов, представленную этой строкой.
Есть более подробные способы итерации над символами в массиве (регулярные для цикла, CharacterIterator
и т.д.), но если вы готовы оплатить стоимость toCharArray()
для каждого из них, это будет наиболее кратким.
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Вам необходимо преобразовать объект 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);
}
Еще одно полезное решение, вы можете работать с этой строкой в виде массива 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 из этого последовательность. Любой char, который сопоставляется суррогатной кодовой точке, передается через неинтерпретируемый. Если последовательность мутирована, когда поток при чтении результат undefined.
forEachOrdered
, а не forEach
?Поведение forEach
явно неопределенное, где, когда forEachOrdered
выполняет действие для каждого элемента этого потока, в порядке столкновения потока, если поток имеет определенный порядок встречи, Поэтому forEach
не гарантирует, что заказ будет сохранен. Также проверьте это question.
Мы также можем использовать codePoints()
для печати, см. этот для получения более подробной информации.
К сожалению, 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"))
...
Если вы используете 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.
Вы также можете использовать лямбда в этом случае.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Для 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 для определенного символа.