我有两个数据结构中的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