【问题标题】:Can a collection have multiple iterators in Java?Java 中一个集合可以有多个迭代器吗?
【发布时间】:2011-07-15 23:39:17
【问题描述】:

是否可以在一个集合中拥有多个迭代器并让每个迭代器独立跟踪?这是假设在分配迭代器后没有删除或插入。

【问题讨论】:

  • 你尝试的时候发生了什么?

标签: java collections iterator


【解决方案1】:

是的。

有时候答案必须是 30 个字符真的很烦人。

【讨论】:

  • 同意。 Java 会自动生成线程并同步
  • @cp:迭代器与线程无关。任何线程都必须由您完成。
  • 所以如果我为一个集合创建两个迭代器,它们不在单独的线程中,并且插入/删除不会包含在任何用途中?
  • @cp:会发生什么完全取决于您,这取决于您如何使用迭代器和底层集合。如果您开始通过迭代器进行迭代,然后在不使用迭代器的情况下修改集合,则继续迭代时您将获得ConcurrentModificationException
【解决方案2】:

是的,这是可能的。这就是它们是迭代器的原因之一,而不仅仅是集合的方法。

例如List 迭代器(在AbstractList 中定义)将int 保存到当前索引(用于迭代器)。如果您创建多个迭代器并多次调用next(),则每个迭代器的int cursor 将具有不同的值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      是和不是。这取决于接口Iterable<T>的实现。

      通常它应该返回实现Iterable接口的类的新实例,类AbstractList是这样实现的:

      public Iterator<E> iterator() {
          return new Itr(); //Where Itr is an internal private class that implement Itrable<T>
      }
      

      如果您使用的是标准 Java 类,您可能会期望以这种方式完成。

      否则,您可以通过调用iterator() 对象来进行简单的测试,然后在第一个和第二个之后运行,如果它们依赖第二个不应该产生任何结果。但这不太可能。

      【讨论】:

        【解决方案5】:

        你可以这样做:

        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);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-02
          • 1970-01-01
          • 1970-01-01
          • 2015-08-23
          • 2023-03-28
          • 2021-05-21
          相关资源
          最近更新 更多