Тому я хочу повторити кожен символ у рядку.
Тому я подумав:
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
-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
як зазначено в doc :
Повертає потік int, що розширює значення char із цієї послідовності. Будь-яка таблиця, яка відображається в сурогатній кодовій точці, передається через неінтерпретоване. Якщо послідовність мутується під час читання потоку, результат не визначений.
forEachOrdered
і ніforEach
?Поведінка forEach
явно недетерміновано там, де 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()
на , String
щоб отримати Stream
символи, але вам потрібно буде кинути int
назад в 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.
Ви також можете використовувати лямбда в цьому випадку.
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()) {}
таке?