необходимо разъяснить в руководстве по Oracle объяснение того, когда использовать итератор против каждой конструкции - PullRequest
0 голосов
/ 14 января 2019

В руководстве Oracle по коллекциям https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html Я вижу следующее:

Use Iterator instead of the for-each construct when you need to:

1. Remove the current element. The for-each construct hides the iterator, so you cannot call remove. Therefore, the for-each construct is not usable for filtering.
2. Iterate over multiple collections in parallel.

Я понимаю первую опцию «удалить текущий элемент», которая поддерживается итератором и не поддерживается для каждой конструкции. Мне нужно уточнить второй вариант «итерация по нескольким коллекциям параллельно», что можно сделать с помощью итератора, а не для каждого. Кто-нибудь может привести пример такого сценария? Насколько я понимаю, for-each также может быть вложенным, поэтому можно путешествовать по нескольким коллекциям параллельно.

Это не дубликат Итератор против For-Each и Итератор против как они спрашивают об общем сравнении итератора и для каждого, и я спрашиваю о конкретном предложении в руководстве по оракулу.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Насколько я понимаю, for-each также может быть вложенным, поэтому можно путешествовать по нескольким коллекциям параллельно.

При вложении for-each мы не можем перемещать несколько коллекций параллельно.

List<A> listA = /*...*/;
List<B> listB = /*...*/;

for(A a:listA){
    for(B b:listB){
        //do something
    }
}

Выше кода не может быть достигнут travel on several collections in parallel, но повторяется вторая коллекция полностью для каждого элемента первой коллекции.

И что-то вроде for(A:listA;B:listB) не компилируется в Java.


Обратите внимание, что помимо Iterator мы также можем использовать традиционный цикл for:

for(int i=0,min=Math.min(listA.size(),listB.size());i<min;i++){
    // ...do something with them...
}
0 голосов
/ 14 января 2019

Предположим, у вас есть две коллекции:

List<A> listA = /*...*/;
List<B> listB = /*...*/;

... и вам нужно проходить через них параллельно (то есть обрабатывать первую запись в каждой, затем обрабатывать следующую запись в каждой и т. Д.) Это невозможно сделать с помощью расширенного цикла for , вы бы использовали Iterator s:

Iterator<A> itA = listA.iterator();
Iterator<B> itB = listB.iterator();
while (itA.hasNext() && itB.hasNext()) {
    A nextA = itA.next();
    B nextB = itB.next();
    // ...do something with them...
}

Если честно, вы можете объединить расширенный цикл for с итератором:

Iterator<A> itA = listA.iterator();
for (B nextB : listB) {
    if (!itA.hasNext()) {
        break;
    }
    A nextA = itA.next();
    // ...do something with them...
}

... но это неуклюже и страдает ясность, предметом for может быть только одна из коллекций, остальные должны быть Iterator s.

...