【问题标题】:need clarification to Oracle tutorial explanation of when to use iterator vs for-each construct需要澄清 Oracle 教程解释何时使用迭代器与 for-each 构造
【发布时间】:2019-01-14 13:04:51
【问题描述】:

在关于集合的 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 来完成。有人可以提供这种情况的例子吗?据我了解,for-each 也可以嵌套,因此可以并行处理多个集合。

这不是Iterator vs For-Each 的重复 和Iterator vs for 当他们询问迭代器和 for-each 的一般比较时,我询问了 oracle 教程中的具体句子。

【问题讨论】:

  • 可能是这样的:while(iter1.hasNext() && iter2.hasNext()){ ... } 这对于增强的 for 循环是不可能的
  • “for-each 也可以嵌套,因此可以并行处理多个集合” 这不是并行迭代。这是为第一个集合的每个元素完全迭代第二个集合。并行迭代意味着同时处理两个元素中的第一个元素,然后同时处理两个元素中的第二个元素,然后是第三个元素,依此类推。如果集合的大小不同,则可能会或可能不会处理较大集合中的额外元素,这取决于循环的目的。

标签: java collections iterator


【解决方案1】:

假设你有两个集合:

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

...并且您需要并行遍历它们(即处理每个条目中的第一个条目,然后处理每个条目中的下一个条目,等等。)您不能使用增强的 for 循环来做到这一点,你会使用Iterators:

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 的主题,其余的必须是Iterators。

【讨论】:

    【解决方案2】:

    据我了解 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...
    }
    

    【讨论】:

    • 这可能比你上一个例子for(int i=0, min = Math.min(listA.size(), listB.size()) ; i &lt; min ; i++) 更好,因为 size 方法只会执行一次
    猜你喜欢
    • 2015-05-21
    • 2011-09-23
    • 2015-08-28
    • 2012-10-22
    • 1970-01-01
    • 2020-10-17
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多