在Java中是否有可能合并迭代器?

54

在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();
  .....
}
14个回答

1
你可以尝试使用 ConcatIterator,它来自于Cactoos
Iterator<String> names = new ConcatIterator<>(
  Arrays.asList("Sarah", "Mary").iterator(),
  Arrays.asList("Jeff", "Johnny").iterator(),
);

此外,请查看 ConcatIterable,它可以连接多个 Iterable

最后一个逗号必须被移除。 - lue

1

我会重构原始设计:

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, ...);

1
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
每个Iterator对象都有自己的内存位置(地址),因此您不能简单地“合并”它们,除非您扩展iterator类并在其中编写自己的实现。
如果您正在处理两个迭代器中的相同数量的对象,则另一种解决方案是在一个循环中处理两个迭代器,如下所示:
   while (iterator1.hasNext() && iterator2.hasNext()) {
      // code
    }

OP不一定需要同时迭代两个。他更希望先迭代一个,然后再迭代另一个。你的第二个解决方案在第一个迭代器被处理后将失败。 - smac89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接