【发布时间】:2011-07-15 23:39:17
【问题描述】:
是否可以在一个集合中拥有多个迭代器并让每个迭代器独立跟踪?这是假设在分配迭代器后没有删除或插入。
【问题讨论】:
-
你尝试的时候发生了什么?
标签: java collections iterator
是否可以在一个集合中拥有多个迭代器并让每个迭代器独立跟踪?这是假设在分配迭代器后没有删除或插入。
【问题讨论】:
标签: java collections iterator
是的。
有时候答案必须是 30 个字符真的很烦人。
【讨论】:
ConcurrentModificationException。
是的,这是可能的。这就是它们是迭代器的原因之一,而不仅仅是集合的方法。
例如List 迭代器(在AbstractList 中定义)将int 保存到当前索引(用于迭代器)。如果您创建多个迭代器并多次调用next(),则每个迭代器的int cursor 将具有不同的值。
【讨论】:
使用并发集合,即使存在插入和删除,您也可以在不同线程中拥有多个迭代器。
【讨论】:
是和不是。这取决于接口Iterable<T>的实现。
通常它应该返回实现Iterable接口的类的新实例,类AbstractList是这样实现的:
public Iterator<E> iterator() {
return new Itr(); //Where Itr is an internal private class that implement Itrable<T>
}
如果您使用的是标准 Java 类,您可能会期望以这种方式完成。
否则,您可以通过调用iterator() 对象来进行简单的测试,然后在第一个和第二个之后运行,如果它们依赖第二个不应该产生任何结果。但这不太可能。
【讨论】:
你可以这样做:
import java.util.ArrayList;
import java.util.Iterator;
public class Miterate {
abstract class IteratorCaster<E> implements Iterable<E>, Iterator<E> {
int mIteratorIndex = 0;
public boolean hasNext() {
return mStorage.size() > mIteratorIndex;
}
public void remove() {
}
public Iterator<E> iterator() {
return this;
}
}
class FloatCast extends IteratorCaster<Float> {
public Float next() {
Float tFloat = Float.parseFloat((String)mStorage.get(mIteratorIndex));
mIteratorIndex ++;
return tFloat;
}
}
class StringCast extends IteratorCaster<String> {
public String next() {
String tString = (String)mStorage.get(mIteratorIndex);
mIteratorIndex ++;
return tString;
}
}
class IntegerCast extends IteratorCaster<Integer> {
public Integer next() {
Integer tInteger = Integer.parseInt((String)mStorage.get(mIteratorIndex));
mIteratorIndex ++;
return tInteger;
}
}
ArrayList<Object> mStorage;
StringCast mSC;
IntegerCast mIC;
FloatCast mFC;
Miterate() {
mStorage = new ArrayList<Object>();
mSC = new StringCast();
mIC = new IntegerCast();
mFC = new FloatCast();
mStorage.add(new String("1"));
mStorage.add(new String("2"));
mStorage.add(new String("3"));
}
Iterable<String> getStringIterator() {
return mSC;
}
Iterable<Integer> getIntegerIterator() {
return mIC;
}
Iterable<Float> getFloatIterator() {
return mFC;
}
public static void main(String[] args) {
Miterate tMiterate = new Miterate();
for (String tString : tMiterate.getStringIterator()) {
System.out.println(tString);
}
for (Integer tInteger : tMiterate.getIntegerIterator()) {
System.out.println(tInteger);
}
for (Float tFloat : tMiterate.getFloatIterator()) {
System.out.println(tFloat);
}
}
}
【讨论】: