我有一个类Polygon
,我希望在其上实现两个迭代器:一个遍历所有元素(交替顺序的顶点和边缘),只是ONCE,另一个是无限循环(循环)。
从for-each使用的角度来看,我的猜测是,我只能通过Iterable.iterator()
的实现,将上面的一个作为默认迭代器,可以与for-each一起使用。它是否正确?或者有没有一种方法可以用于 - 每个都有?
答案 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:循环(多边形)){ ... }
无休止地迭代。作为奖励,循环修饰符可以应用于任何可迭代的。