Java,但有多种迭代器类型?

Java,但有多种迭代器类型?,java,iterator,foreach,iteration,Java,Iterator,Foreach,Iteration,我有一个类Polygon,我希望在该类上实现两个迭代器:一个只遍历所有元素(顶点和边以交替顺序)一次,另一个无限次地遍历它们(循环) 从for-each用法的角度来看,我的猜测是,通过实现Iterable.iterator(),我只能让上面的一个作为默认迭代器,可以用于for-each。这是正确的吗?或者有没有一种方法可以同时用于这两种情况?只需添加两个方法,返回两个不同的迭代器,每种情况一个: public Iterable<String> eachOnce() { Lis

我有一个类
Polygon
,我希望在该类上实现两个迭代器:一个只遍历所有元素(顶点和边以交替顺序)一次,另一个无限次地遍历它们(循环)


从for-each用法的角度来看,我的猜测是,通过实现
Iterable.iterator()
,我只能让上面的一个作为默认迭代器,可以用于for-each。这是正确的吗?或者有没有一种方法可以同时用于这两种情况?

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

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.eachOnce()) { }

或者循环版本

我认为比已经给出的答案更好的是一种将任何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); }
    };
  }
}
反复

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


不断地重复。作为奖励,循环修饰符可以应用于任何iterable。

很好的一个GHad,我很高兴我这么问。这保持了for each的易用性,并且不会破坏封装来解决问题。+1这本质上与java.util.Map的功能相同-您可以调用entrySet()、keySet()或values(),它们都返回各种Iterables。一个很好的替代方法是Geoff。我以后可能会用这个。
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); }
    };
  }
}
for (Element e: polygon) {
  ...
}