多个集合的并行迭代

时间:2015-10-19 06:35:37

标签: java collections foreach

我正在阅读J. Bloch" Effective Java"现在我在关于for-each vs for-loop的部分。他提到了我们无法使用for-each循环的三种情况,其中一种情况如下:L

  

并行迭代 - 如果需要遍历多个集合   并行,那么你需要显式控制迭代器或索引   变量,以便可以前进所有迭代器或索引变量   锁步(无意识地在有缺陷的牌和骰子中表现出来)   上面的例子。)

案件对我来说不太清楚,我无法想象一个例子。

首先想到的是,它只是在多个线程中迭代相同的集合,但它可能不是他的意思。我没有看到任何限制阻止我们这样做(只读)。实际上:

public class MyRunnable implements Runnable{

    private Collection<String> col;

    //CTOR ommmited

    public void run(){
    for(String s : col){
       //print o, not modify
    }

}

然后我们用相同的实例启动一些线程。因此,我们不怕获取ConcurrentModificationExceptionJavaDocs)因为我们执行只读访问,即使是同时多个线程也是如此。

出了什么问题?

2 个答案:

答案 0 :(得分:6)

我不认为他的意思是&#34;并行&#34;和同时一样。

这简单得多。假设您有两个集合,并且您希望相同的循环(不是嵌套循环)迭代它们,并在每次迭代中获取每个元素的i&#39;元素。你不能用增强的for循环来做到这一点,因为它隐藏了索引和迭代器。

您必须使用标准for循环(对于有序集合):

private List<String> one;
private List<String> two;

public void run(){
    for(int i = 0; i<one.size() && i<two.size();i++){
       // do something with one.get(i) and two.get(i)
    }
}

或显式迭代器(对于无序的集合):

private Set<String> one;
private Set<String> two;

public void run(){
    for(Iterator<String> iterOne=one.iterator(),Iterator<String> iterTwo=two.iterator(); iterOne.hasNext()&&iterTwo.hasNext();){
       // do something with iterOne.next() and iterTwo.next()
    }
}

答案 1 :(得分:1)

  

并行迭代 - 如果需要遍历多个集合   并行,那么你需要显式控制迭代器或索引   变量,以便可以前进所有迭代器或索引变量   锁步(无意识地在有缺陷的牌和骰子中表现出来)   上面的例子。)

简单的英语锁步意味着同时。这意味着您无法使用for-each同时迭代多个集合。您将不得不使用单独的迭代器( 或者像Eran所示的循环,如下所示:

Iterator iterator1 = list1.iterator();
Iterator iterator2 = list2.iterator();
Iterator iterator3 = list3.iterator();
while (iterator1 .hasNext() && iterator2 .hasNext() && iterator3.hasNext()){
    Item i1 = iterator1 .next();
    Item i2 = iterator2 .next();
    Item i3 = iterator3.next();
    // rest of your code.
}