2010-02-19 208 views
3

我有兩個數據結構中的Java:
一個被稱爲DebateAssignment且具有5個DebateTeam對象,與包括迭代過嵌套集合

{JUDGE, PROP1, PROP2, OP1, OP2} 

在另一類特定枚舉每個相關聯的我使用List<DebateAssignment>和我想要創建一個迭代器,該迭代器將指向特定DebateAssignment中的特定DebateTeam,並且我希望它遍歷所有分配的所有分配,從分配到分配無縫地進行。

我該怎麼做呢?

+0

你可以顯示DebateAssignment的代碼嗎? – 2010-02-19 12:36:04

+4

在閱讀完您的問題後,我會融入大腦。 – Roman 2010-02-19 12:38:45

+0

我猜你'Iterator '不是你要找的,你清楚的知道它。你能澄清一下你的問題嗎? (如果只是爲了讓可憐的羅馬人的大腦重新融化?) – 2010-02-19 12:40:41

回答

4

假設DebateAssignment具有類似

public Collection<DebateTeam> getDebateTeams(); 

你想要的Iterator<DebateTeam>

如果是的話,你想要的東西,如:

public class DebateTeamIterator implements Iterator<DebateTeam> { 
    private Iterator<DebateAssignment> iAssignment; 
    private Iterator<DebateTeam> iTeam; 

    public DebateTeamIterator(Iterator<DebateTeam> iAssignment) { 
     this.iAssignment = iAssignment; 
     if (iAssignment.hasNext()) 
      iTeam = iAssignment.next().getDebateTeams().iterator(); 
     else 
      iTeam = new LinkedList<DebateTeam>().iterator(); 
    } 

    public boolean hasNext() { 
     return iTeam.hasNext() || iAssignment.hasNext(); 
    } 

    public DebateTeam next() { 
     if (!iTeam.hasNext()) 
      iTeam = iAssignment.next().getDebateTeams().iterator(); 
     return iTeam.next(); 
    } 

    // ... other methods removed for brevity... 
} 
+1

我可以很容易地被指責爲極端的偏見,但我不認爲這是建議粘貼這麼多的代碼行的好建議,這是不重要的和未經證實的,而不是(你猜對了)使用已經沉沒了許多人日進行徹底測試並確定其實施。 – 2010-02-19 16:59:47

+0

謝謝!從未實現過迭代器,這個答案真的很有用! – 2010-02-19 17:33:59

0

你可以像ArrayList一樣擴展一個列表實現,並添加一個方法來返回一個你想做的Iterator實現。

覆蓋iterator()方法可能不是它返回的迭代器的泛型類型的選項。

+0

其實我不明白他真的需要什麼,但無論如何,擴展收藏是一種不好的做法。你可以圍繞ArrayList創建一個包裝類,並裝飾一些像iterator()這樣的方法(即它是一個Decorator模式)。 – Roman 2010-02-19 12:44:57

+0

如果他真的想要第一個類列表,我相信用擴展去顯着簡單,因爲對於組合,他必須實現所有的List方法並將它們委託給實際的List。 我同意這個要求很奇怪。 – 2010-02-19 12:48:07

2

也許最簡單的方法是:

List<DebateAssignment> list = ... 
List<DebateTeam> dtList = new ArrayList<DebateTeam>(); 
for (DebateAssignment da : list) { 
    dtList.addAll(da.getTeams()); 
} 
return dtList.iterator(); 

當然,你可以寫一個實現Iterator<DebateTeam>認爲「變平」嵌套迭代器的新類,但這有些牽扯,因爲你必須明確地跟蹤這兩個迭代器......(有關這方面的細節,請參閱克林頓的回答)。

5

一種方法,使用google-collections/guava

return Iterables.concat(Iterables.transform(assignments, 
    new Function<DebateAssigment, Collection<DebateTeam>>() { 
     public Collection<DebateTeam> apply(DebateAssignment assignment) { 
     return assignment.getDebateTeams(); 
     } 
    })); 

另一種方法是將數據存儲爲Multimap<DebateAssignment, DebateTeam>,然後簡單地遍歷任values()entries()或視圖。該數據結構不會模擬JUDGE/PROP1 /等。協會,但。