Возможно ли объединить итераторы в Java? - PullRequest
42 голосов
/ 31 августа 2010

Возможно ли объединить итераторы в Java? У меня есть два итератора, и я хочу объединить / объединить их, чтобы я мог выполнять итерацию, хотя их элементы за один раз (в одном цикле), а не за два шага. Это возможно?

Обратите внимание, что количество элементов в двух списках может быть различным, поэтому один цикл по обоим спискам не является решением.

Iterator<User> pUsers = userService.getPrimaryUsersInGroup(group.getId());
Iterator<User> sUsers = userService.getSecondaryUsersInGroup(group.getId());

while(pUsers.hasNext()) {
  User user = pUsers.next();
  .....
}

while(sUsers.hasNext()) {
  User user = sUsers.next();
  .....
}

Ответы [ 13 ]

1 голос
/ 06 октября 2010

Я бы реорганизовал оригинальный дизайн из:

Iterator<User> pUsers = userService.getPrimaryUsersInGroup(group.getId());
Iterator<User> sUsers = userService.getSecondaryUsersInGroup(group.getId());

На что-то вроде:

Iterator<User> users = userService.getUsersInGroup(group.getId(), User.PRIMARY, User.SECONDARY, ...);
0 голосов
/ 20 марта 2019

В Apache Commons Collections есть public static <E> Iterator<E> org.apache.commons.collections4.IteratorUtils.chainedIterator(Collection<Iterator<? extends E>> iterators) с надписью

Получает итератор, который перебирает коллекции итераторов один за другим.

что должно быть тем, что вы хотите.

import java.util.Arrays;
import java.util.Iterator;

import org.apache.commons.collections4.IteratorUtils;
//also works: import org.apache.commons.collections.IteratorUtils;

class Scratch {
    public static void main( String[] args ) {
        final Iterator<String> combinedIterator = IteratorUtils.chainedIterator(
                Arrays.asList( "a", "b", "c" ).iterator(),
                Arrays.asList( "1", "2", "3" ).iterator()
            );
        while( combinedIterator.hasNext() ){
            System.out.println( combinedIterator.next() );
        }
        // "abc123" will have been printed out
    }
}
0 голосов
/ 31 августа 2010

каждый Iterator объект содержит собственную область памяти ( адрес ), поэтому вы не можете просто "объединить" их.за исключением случаев, когда вы расширяете класс iterator и пишете свою собственную реализацию там.

Если вы имеете дело с одинаковым количеством объектов в обоих итераторах, альтернативным решением будет обработка двух итераторов водин цикл, как это:

   while (iterator1.hasNext() && iterator2.hasNext()) {
      // code
    }
...