一个集合可以在Java中有多个迭代器吗?

时间:2011-03-15 17:18:55

标签: java collections iterator

是否可以在单个集合中包含多个迭代器并使每个迭代器独立跟踪?假设在分配迭代器之后没有删除或插入。

5 个答案:

答案 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)

使用并发集合,即使有插入和删除,也可以在不同的线程中拥有多个迭代器。