2010-09-15 61 views
5

我有一個類Polygon我希望實現兩個迭代器:一個遍歷所有元素(頂點和邊交替順序)只是一次,另一個遍歷它們遍歷(循環)。每個Java的Java,但多個迭代器類型?

從一個for-each使用的角度來看,我的猜測是我只能通過執行Iterable.iterator()實現以上其中一個默認迭代器,它可以用於for-each。它是否正確?或者我有兩種方法可以使用嗎?

回答

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

或環狀版

+0

不錯的一個很好,我很高興我問。這保證了for-each的易用性,並且不會破壞封裝來解決問題。 – 2010-09-15 15:30:19

+0

+1這與java.util.Map的作用基本相同 - 您可以調用entrySet(),keySet()或values(),它們都返回各種Iterables。 – Avi 2010-09-15 16:34:29

3

的答案,我覺得比已經存在的那些出色的是,變成可迭代的成環的方法一。

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:週期(多邊形)){ 。 ... }

無限循環。作爲獎勵,循環修飾符可以應用於任何可迭代的。

+0

一個不錯的選擇,傑夫。我將來可能會使用它。 – 2010-09-15 16:42:18