在有关集合https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html的Oracle教程中 我看到以下内容:
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教程中的具体句子。
答案 0 :(得分:8)
假设您有两个集合:
List<A> listA = /*...*/;
List<B> listB = /*...*/;
...,您需要并行遍历它们(即,处理每个条目中的第一个条目,然后处理每个条目中的下一个条目,等等。)您无法使用增强型{{1} }循环中,您将使用for
s:
Iterator
为了公平起见,您可以将增强的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
s。
答案 1 :(得分: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...
}