每个Java,但多个迭代器类型?

时间:2010-09-15 15:08:32

标签: java iterator foreach iteration

我有一个类Polygon,我希望在其上实现两个迭代器:一个遍历所有元素(交替顺序的顶点和边缘),只是ONCE,另一个是无限循环(循环)。

从for-each使用的角度来看,我的猜测是,我只能通过Iterable.iterator()的实现,将上面的一个作为默认迭代器,可以与for-each一起使用。它是否正确?或者有没有一种方法可以用于 - 每个都有?

2 个答案:

答案 0 :(得分:11)

只需添加两个返回两个不同迭代器的方法,每种情况一个:

public Iterable<String> eachOnce() {
    List<String> allResults = new ArrayList<String>();
    // fill list
    return allResults;
}

public Iterable<String> eachCyclic() {
    return new Iterable<String>() {

        public Iterator<String> iterator() {
            return new Iterator<String>() {

                public boolean hasNext() {
                    return true;
                }

                public String next() {
                    // TODO implement
                    return null;
                }

                public void remove() {
                    // do nothing
                }
            };

        }
    };
}

这只是一个字符串列表的例子,只是适应。

而不是

for (Polygon p : polygons) { }

只需使用

for (Polygon p : polygons.eachOnce()) { }

或循环版

答案 1 :(得分:3)

我认为答案比已经提出的答案更好的是将任何Iterable转换为循环的答案。

public class IterableUtils {
  public static class CyclicIterator<T> implements Iterator<T> {
    private final Iterable<T> inner;
    private Iterator<T> currentIter;
    public CyclicIterator(Iterable<T> inner) {
      this.inner = inner;
    }
    public boolean hasNext() {
      if (currentIter == null || !currentIter.hasNext()) {
        currentIter = inner.iterator();
      }
      return currentIter.hasNext();
    }
    public T next() {
      if (currentIter == null || !currentIter.hasNext()) {
        currentIter = inner.iterator();
      }
      return currentIter.next();
    }
    public void remove() {
      currentIter.remove();
    }
  }
  public static <T> Iterable<T> cycle(final Iterable<T> i) {
    return new Iterable<T>() {
      public Iterator<T> iterator() { return new CyclicIterator<T>(i); }
    };
  }
}

然后你可以在Polygon类中实现单迭代器方法并使用

for (Element e: polygon) {
  ...
}

迭代一次

for(元素e:循环(多边形)){      ...    }

无休止地迭代。作为奖励,循环修饰符可以应用于任何可迭代的。