2010-02-19 281 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 /等。协会,但。