如何在Java中并行迭代多个列表?

如何在Java中并行迭代多个列表?,java,iterator,guava,Java,Iterator,Guava,我想创建一个函数来迭代多个列表。现在我知道这些列表的大小完全相同(它们也可以有不同的类型),例如: List<Integer> list1 = getList1(); List<String> list2 = getList2(); List<Long> list3 = getList3(); list1.size() == list2.size(); // returns true list2.size() == list3.size(); // retur

我想创建一个函数来迭代多个列表。现在我知道这些列表的大小完全相同(它们也可以有不同的类型),例如:

List<Integer> list1 = getList1();
List<String> list2 = getList2();
List<Long> list3 = getList3();
list1.size() == list2.size(); // returns true
list2.size() == list3.size(); // returns true
我想做与我在这里看到的番石榴中讨论的相同的事情,但看起来还没有实现:

他们说要做Iterators.interleave或Iterators.zip,我也想做类似的事情,但我一直没能做到,所以有人能帮我一点忙吗?谢谢


我不希望得到一个列表的大小并通过索引对其进行迭代,因为将来我可以有不同大小的列表,所以我只希望使用一种方法来实现这一点。

您可以创建一个新线程并在那里迭代列表。生成多个此therad,您可以并行迭代列表

若要传递任何模板类型的列表,只需将方法参数指定为List,尽管这可能会导致编译器警告。您可以尝试的另一件事是将列表作为list传递,并执行类型为T的运行时检查和相应的操作

然而,如果“并行”并不是指多线程/并发性——而是希望能够在一个循环中迭代3个列表,那么类似的方法就可以了(警告代码只是一个粗略的示例——未测试/不符合编码标准):

列表列表1=。。。
列表2=。。。
列表3=。。。

对于(inti=0,j=0,k=0;i我不认为你是在说并行,因为这些值被用来调用一个方法。如果你想从每个列表中获得相同的元素,那么在不同线程上同时跳过不同的列表对你没有好处


您只需执行for循环,然后调用list1.get(i)、list2.get(i)、list3.get(i)。

复合迭代器可能是个不错的主意,例如:

Iterator<Array<?>> compoundIterator = createIterator(List1, List2, List3);


这个解决方案的好处在于,你隐藏了所有关于一个列表是否用完的细节(当然,如果一个列表用完了,你必须决定你想做什么,但也可以包装在里面)。

但是我需要为这些列表的一部分应用一个函数(我编辑了我的帖子来解释),如果我必须使用线程,或者我必须使用复杂的逻辑来同步,我不能这样做。不?在这种情况下,请阅读新的Java 7 Fork/Join功能,看看它是否可以帮助您:我不明白为什么我需要线程,我只需要在列表上并行迭代,以便在每次迭代时应用函数,没有办法避免线程吗?H你如何在没有多线程的情况下并行地做一些事情?我认为你做不到。guava.zip的想法正是我想要做的,但它似乎不涉及任何线程。你是在尝试使用zip技术同时迭代多个列表,还是你真的在尝试多线程?IIRC这从来没有决定过,他说nce从未实现。我通过创建一个由索引键控的多重映射并添加每个集合的项(因为我不能保证集合类似于ArrayList,所以get(n)不是确定性的)来伪造它不,我只想同时使用类似zip的东西进行迭代,就像我解释的那样,我想做一些类似于他们在guava上讨论的事情。guava解决方案似乎有逻辑来处理不同大小的列表,而你不需要。谢谢你,Rob,我也考虑过这个问题,但我想做更多的迭代程序我认为番石榴的讨论正是我想做但没有实现的,正如我所说的,它让你能够看到你是否在最后。你没有这个问题吗?它是可行的,但在未来,我可以有不同大小的列表,我也希望能够处理这个问题,谢谢。当然。另一件很酷的事情可能是制作自己的迭代器,它是其他迭代器的聚合器,然后返回一个数组。我将添加它作为另一个答案。是的,我想这正是我想要的,谢谢你的帮助。我喜欢这个解决方案,谢谢我会这样做!是hrd创建迭代器实现吗n?我需要做些什么来奖励你的答案吗?只需单击复选框来奖励。不,做你自己的迭代器很容易,也是一个很好的练习。当然。如果你有问题,请再次发布,但你只是提供了两个你将要授权的方法的实现。:)我更喜欢你发布的简单解决方案作为你的另一个答案。在这种情况下,必须将每个数组元素强制转换为正确的类型。我看不出这种方法有什么好处。如果你打算从数组中提供输入,使用强制转换可能不是一个很大的考虑因素。我是一个硬核OO人,我认为你应该在所有事情上使用对象,但也就是说,我看到了聚合迭代器的潜在价值。坦率地说,您可以通过参数化类型来解决您的异议,例如CompoundAggregator。这样就不会有强制转换(不,您不能执行数量可变的类型参数,但是,您希望同时处理的事情可能会有限制)。
List list1 = ...
List list2 = ...
List list3 = ...

for(int i=0,j=0,k=0; i<list1.size() && j<list2.size() && k<list3.size(); ++i,++j,++k)
{
   Object elemOfList1 = list1.get(i);
   Object elemOfList2 = list2.get(j);
   Object elemOfList3 = list3.get(k);
   // do something here
}
Iterator<Array<?>> compoundIterator = createIterator(List1, List2, List3);
while (compoundIterator.hasElements()){
    Array[] elements = compountIterator.nextElement();
    calculate(elements[0], elements[1], elements[2]);
}