Поэтому я хочу повторить для каждого символа в строке.
Вот я и подумал:
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()
за каждый, это самый лаконичный вариант.
toCharArray( )
вызывается 3 раза?
211900000
время завершения for (char c : str.toCharArray()) { }
~ 250 мс, а время завершения for (char c : charArray) { }
<10 мс. Конечно, эти значения времени будут зависеть от аппаратного обеспечения, но вывод заключается в том, что один метод значительно дороже, чем другой.
toCharArray()
это не внутри тела цикла; он вызывается только один раз, а затем цикл повторяется по полученному массиву. (Цикл for-each отличается от общего for
-loop, который оценивает условие остановки каждую итерацию.)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Другое полезное решение, вы можете работать с этой строкой как массивом String
for (String s : "xyz".split("")) {
System.out.println(s);
}
split()
отображаются более чем на один символ Java, что имеет место почти для всех смайликов. Например, этот вариант вашего примера будет зацикливаться четыре раза, а не три:for (String s : "x😁z".split("")) { System.out.println(s); }
Вам необходимо преобразовать объект 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);
}
В Java 8 мы можем решить это как:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
Метод chars () возвращает, IntStream
как указано в документе :
Возвращает поток значений int, расширяющих ноль, из этой последовательности. Любой символ, который отображается на суррогатную кодовую точку, пропускается через интерпретацию. Если последовательность видоизменяется во время чтения потока, результат не определен.
forEachOrdered
а не forEach
?Поведение forEach
является явно недетерминированным, когда as forEachOrdered
выполняет действие для каждого элемента этого потока в порядке обнаружения потока, если поток имеет определенный порядок встречи. Так forEach
что не гарантирует, что заказ будет сохранен. Также проверьте этот вопрос для получения дополнительной информации.
Мы также можем использовать 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()
a String
для получения Stream
символов, но вам нужно будет привести int
обратно к a, char
как chars()
возвращает IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Если вы используете Java 8 с коллекциями Eclipse , вы можете использовать метод CharAdapter
класса forEach
с лямбда-ссылкой или ссылкой на метод для перебора всех символов в String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Этот конкретный пример может также использовать ссылку на метод.
Strings.asChars("xyz").forEach(System.out::print)
Примечание: я являюсь коммиттером для Eclipse Collections.
Вы также можете использовать лямбду в этом случае.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Для 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, который помогает пройти строку для конкретного символа.
for (char st: "xyz".toCharArray()) {}
такое?