如果要再次迭代,我们必须缓存迭代器中的值。至少我们可以将第一次迭代和缓存结合起来:
Iterator<IntWritable> it = getIterator();
List<IntWritable> cache = new ArrayList<IntWritable>();
// first loop and caching
while (it.hasNext()) {
IntWritable value = it.next();
doSomethingWithValue();
cache.add(value);
}
// second loop
for(IntWritable value:cache) {
doSomethingElseThatCantBeDoneInFirstLoop(value);
}
(只是为了添加一个带有代码的答案,知道你在自己的评论中提到了这个解决方案;))
为什么没有缓存就不可能:a是实现接口的东西,没有一个要求,对象实际上存储值。迭代两次,要么必须重置迭代器(不可能)要么克隆它(再次:不可能)。Iterator
Iterator
举个例子,一个迭代器的例子,其中克隆/重置没有任何意义:
public class Randoms implements Iterator<Double> {
private int counter = 10;
@Override
public boolean hasNext() {
return counter > 0;
}
@Override
public boolean next() {
count--;
return Math.random();
}
@Override
public boolean remove() {
throw new UnsupportedOperationException("delete not supported");
}
}