На самом деле нет хорошего ответа. Итератор в Java специально применяется к коллекции отдельных элементов (объектов). Вы могли бы подумать, что String
, который реализует CharSequence
, должен быть «коллекцией» дискретных символов. Вместо этого он рассматривается как единый объект, состоящий из символов.
В Java кажется, что итераторы применяются только к коллекциям, а не к строке. Нет причин, по которым это так (рядом, как я могу сказать - вам, вероятно, придется поговорить с Гослином или авторами API); это, по-видимому, соглашение или дизайнерское решение. Действительно, нет ничего , предотвращающийCharSequence
от внедрения Iterable
.
Тем не менее, вы можете перебрать символов в строке следующим образом:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
Или:
for(char c : str.toCharArray()) {
System.out.println(c);
}
Или:
"Java 8".chars().forEach(System.out::println);
Также обратите внимание, что вы не можете изменить символ строки, потому что строки являются неизменными. Перемещаемым компаньоном для String является StringBuilder (или старший StringBuffer).
EDIT
Для уточнения на основе комментариев по этому ответу. Я пытаюсь объяснить возможное обоснование о том, почему нет Итератора на String
. Я не пытаюсь сказать, что это невозможно; действительно, я думаю, что для CharSequence
было бы целесообразно реализовать Iterable
.
String
содержит CharSequence
, который, если только концептуально, отличается от String
. A String
обычно рассматривается как единый объект, тогда как CharSequence
- это то, что: последовательность символов. Было бы целесообразно иметь итератор последовательности символов (т. Е. На CharSequence
), но не просто на самом String
.
Как Foxfire справедливо указал в комментариях, String
реализует интерфейс CharSequence
, поэтому тип-накрест, String
является CharSequence
. Семантически, мне кажется, что это две разные вещи: я, вероятно, педантичен здесь, но когда я думаю о String
, я обычно думаю об этом как о единственном сущности, которая состоит из персонажей. Рассмотрим разницу между порядком цифр 1, 2, 3, 4
и номером 1234
. Теперь рассмотрим разницу между строкой abcd
и последовательностью символов a, b, c, d
. Я пытаюсь указать на эту разницу.
На мой взгляд, спрашивая, почему String
не имеет итератора, это как спрашивать, почему Integer
не имеет итератора, чтобы вы могли перебирать отдельные цифры.
Нужна проблема для итерации массива символов Array? (strInput.ToCharArray) –
Tim: Строка # toCharArray создает массив с копией символов String. Даже если он работает, он накладывает ненужные накладные расходы, чтобы перебирать символы. – jarnbjo
@jambjo 'Iterator' будет меньше над головой ??? –