代码之家  ›  专栏  ›  技术社区  ›  Engineer

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

  •  5
  • Engineer  · 技术社区  · 14 年前

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

    从for-each用法的角度来看,我的猜测是,通过实现,我只能让上面的一个作为默认迭代器,它可以与for-each一起使用 Iterable.iterator()

    2 回复  |  直到 14 年前
        1
  •  12
  •   GHad    14 年前

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

    或者循环版

        2
  •  3
  •   Geoff Reedy    14 年前

    我认为比已经给出的答案更好的方法是将任何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:循环(多边形)){

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