Поэтому я хочу повторить для каждого символа в строке.
Вот я и подумал:
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
источник
split()
отображаются более чем на один символ Java, что имеет место почти для всех смайликов. Например, этот вариант вашего примера будет зацикливаться четыре раза, а не три:for (String s : "x😁z".split("")) { System.out.println(s); }
Вам необходимо преобразовать объект String в массив char, используя метод
toCharArray
() класса String:источник
В Java 8 мы можем решить это как:
Метод chars () возвращает,
IntStream
как указано в документе :Почему использовать,
forEachOrdered
а неforEach
?Поведение
forEach
является явно недетерминированным, когда asforEachOrdered
выполняет действие для каждого элемента этого потока в порядке обнаружения потока, если поток имеет определенный порядок встречи. ТакforEach
что не гарантирует, что заказ будет сохранен. Также проверьте этот вопрос для получения дополнительной информации.Мы также можем использовать
codePoints()
для печати, см. Этот ответ для более подробной информации.источник
К сожалению, Java не делает
String
реализациюIterable<Character>
. Это можно легко сделать. Есть,StringCharacterIterator
но это даже не реализуетсяIterator
... Так что сделайте свой собственный:Теперь вы можете (несколько) легко запустить
for (char c : new CharSequenceCharacterIterable("xyz"))
...источник
Если вы используете Java 8, вы можете использовать
chars()
aString
для полученияStream
символов, но вам нужно будет привестиint
обратно к a,char
какchars()
возвращаетIntStream
.Если вы используете Java 8 с коллекциями Eclipse , вы можете использовать метод
CharAdapter
классаforEach
с лямбда-ссылкой или ссылкой на метод для перебора всех символов вString
.Этот конкретный пример может также использовать ссылку на метод.
Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Вы также можете использовать лямбду в этом случае.
источник
Для Travers a String вы также можете использовать
charAt()
эту строку.лайк :
charAt()
это метод обработки строк в Java, который помогает пройти строку для конкретного символа.источник
for (char st: "xyz".toCharArray()) {}
такое?