我有一個類Polygon
我希望實現兩個迭代器:一個遍歷所有元素(頂點和邊交替順序)只是一次,另一個遍歷它們遍歷(循環)。每個Java的Java,但多個迭代器類型?
從一個for-each使用的角度來看,我的猜測是我只能通過執行Iterable.iterator()
實現以上其中一個默認迭代器,它可以用於for-each。它是否正確?或者我有兩種方法可以使用嗎?
我有一個類Polygon
我希望實現兩個迭代器:一個遍歷所有元素(頂點和邊交替順序)只是一次,另一個遍歷它們遍歷(循環)。每個Java的Java,但多個迭代器類型?
從一個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) { }
只使用
for (Polygon p : polygons.eachOnce()) { }
或環狀版
的答案,我覺得比已經存在的那些出色的是,變成可迭代的成環的方法一。
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類單iterator方法和使用
for (Element e: polygon) {
...
}
遍歷一次,
爲(元素E:週期(多邊形)){ 。 ... }
無限循環。作爲獎勵,循環修飾符可以應用於任何可迭代的。
一個不錯的選擇,傑夫。我將來可能會使用它。 – 2010-09-15 16:42:18
不錯的一個很好,我很高興我問。這保證了for-each的易用性,並且不會破壞封裝來解決問題。 – 2010-09-15 15:30:19
+1這與java.util.Map的作用基本相同 - 您可以調用entrySet(),keySet()或values(),它們都返回各種Iterables。 – Avi 2010-09-15 16:34:29