是否可以在单个集合中包含多个迭代器并使每个迭代器独立跟踪?假设在分配迭代器之后没有删除或插入。
答案 0 :(得分:13)
是
有时候答案必须是30个字符真的很烦人。
答案 1 :(得分:7)
是的,有可能。这是他们成为迭代器的一个原因,而不仅仅是集合的方法。
例如List
迭代器(在AbstractList
中定义)将int
保存到当前索引(对于迭代器)。如果您创建多个迭代器并以不同的次数调用next()
,则每个迭代器都会使int cursor
具有不同的值。
答案 2 :(得分:1)
是和否。这取决于接口Iterable<T>
的实现。
通常它应该返回实现Iterable接口的类的新实例,类AbstractList实现这样:
public Iterator<E> iterator() {
return new Itr(); //Where Itr is an internal private class that implement Itrable<T>
}
如果您使用的是标准Java类,您可能希望以这种方式完成此操作。
否则你可以通过调用iterator()
形成对象来进行一个简单的测试,然后在第二个之后运行,如果它们是依赖的,则第二个不应该产生任何结果。但这种可能性很小。
答案 3 :(得分:1)
你可以这样做:
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);
}
}
}
答案 4 :(得分:0)
使用并发集合,即使有插入和删除,也可以在不同的线程中拥有多个迭代器。