Вы дважды назвали iterator.next()
в теле цикла. Каждый раз, когда вы делаете, итератор продвигается вперед.
Возможно, вы захотите вызвать его один раз в теле и сохранить в локальной переменной.
String next = iterator.next();
al.add(next);
Log.i(LOG_TAG, "MAC " + next + " for the user " + userId);
Обратите внимание, что Iterator<E>
определяет E next()
, поэтому вам не нужно приводить к String
в этом случае.
Еще один иллюстративный пример
Вот пример из Руководство по языку Java / Для каждого цикла :
Вот распространенная ошибка, которую люди делают, когда пытаются сделать вложение
итерация по двум коллекциям:
List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();
// BROKEN - throws NoSuchElementException!
for (Iterator i = suits.iterator(); i.hasNext(); )
for (Iterator j = ranks.iterator(); j.hasNext(); )
sortedDeck.add(new Card(i.next(), j.next()));
Можете ли вы обнаружить ошибку? Не расстраивайся, если не можешь. Многие опытные программисты
сделали эту ошибку в тот или иной момент. Проблема в том, что next
метод вызывается слишком много раз для «внешней» коллекции (мастей). Это
вызывается во внутреннем цикле как для внешних, так и для внутренних коллекций,
что неправильно. Чтобы исправить это, вы должны добавить переменную в
Объем внешней петли для удержания костюма:
// Fixed, though a bit ugly
for (Iterator i = suits.iterator(); i.hasNext(); ) {
Suit suit = (Suit) i.next();
for (Iterator j = ranks.iterator(); j.hasNext(); )
sortedDeck.add(new Card(suit, j.next()));
}
Так, что все это имеет отношение к конструкции for-each? Это специально для
вложенная итерация! Полюбуйтесь:
for (Suit suit : suits)
for (Rank rank : ranks)
sortedDeck.add(new Card(suit, rank));
Если бы JSONObject.keys()
было Iterable
вместо Iterator
, тогда для каждого - лучшее решение в вашем случае. Если вы считаете, что улучшение читабельности того стоит, вы можете, например, добавьте keys
в Collection<String>
, то есть Iterable
.
Смежные вопросы