我有兩個數據結構中的Java:
一個被稱爲DebateAssignment且具有5個DebateTeam對象,與包括迭代過嵌套集合
{JUDGE, PROP1, PROP2, OP1, OP2}
在另一類特定枚舉每個相關聯的我使用List<DebateAssignment>
和我想要創建一個迭代器,該迭代器將指向特定DebateAssignment中的特定DebateTeam,並且我希望它遍歷所有分配的所有分配,從分配到分配無縫地進行。
我該怎麼做呢?
我有兩個數據結構中的Java:
一個被稱爲DebateAssignment且具有5個DebateTeam對象,與包括迭代過嵌套集合
{JUDGE, PROP1, PROP2, OP1, OP2}
在另一類特定枚舉每個相關聯的我使用List<DebateAssignment>
和我想要創建一個迭代器,該迭代器將指向特定DebateAssignment中的特定DebateTeam,並且我希望它遍歷所有分配的所有分配,從分配到分配無縫地進行。
我該怎麼做呢?
假設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...
}
我可以很容易地被指責爲極端的偏見,但我不認爲這是建議粘貼這麼多的代碼行的好建議,這是不重要的和未經證實的,而不是(你猜對了)使用已經沉沒了許多人日進行徹底測試並確定其實施。 – 2010-02-19 16:59:47
謝謝!從未實現過迭代器,這個答案真的很有用! – 2010-02-19 17:33:59
你可以像ArrayList一樣擴展一個列表實現,並添加一個方法來返回一個你想做的Iterator實現。
覆蓋iterator()方法可能不是它返回的迭代器的泛型類型的選項。
其實我不明白他真的需要什麼,但無論如何,擴展收藏是一種不好的做法。你可以圍繞ArrayList創建一個包裝類,並裝飾一些像iterator()這樣的方法(即它是一個Decorator模式)。 – Roman 2010-02-19 12:44:57
如果他真的想要第一個類列表,我相信用擴展去顯着簡單,因爲對於組合,他必須實現所有的List方法並將它們委託給實際的List。 我同意這個要求很奇怪。 – 2010-02-19 12:48:07
也許最簡單的方法是:
List<DebateAssignment> list = ...
List<DebateTeam> dtList = new ArrayList<DebateTeam>();
for (DebateAssignment da : list) {
dtList.addAll(da.getTeams());
}
return dtList.iterator();
當然,你可以寫一個實現Iterator<DebateTeam>
認爲「變平」嵌套迭代器的新類,但這有些牽扯,因爲你必須明確地跟蹤這兩個迭代器......(有關這方面的細節,請參閱克林頓的回答)。
一種方法,使用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 /等。協會,但。
你可以顯示DebateAssignment的代碼嗎? – 2010-02-19 12:36:04
在閱讀完您的問題後,我會融入大腦。 – Roman 2010-02-19 12:38:45
我猜你'Iterator'不是你要找的,你清楚的知道它。你能澄清一下你的問題嗎? (如果只是爲了讓可憐的羅馬人的大腦重新融化?) –
2010-02-19 12:40:41