Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套集合上的迭代器_Java_Collections_Iterator - Fatal编程技术网

Java 嵌套集合上的迭代器

Java 嵌套集合上的迭代器,java,collections,iterator,Java,Collections,Iterator,我有两种Java数据结构: 其中一个称为DebateAssignment,有5个DebateTeam对象,每个对象与一个特定的枚举关联,该枚举包括 {JUDGE, PROP1, PROP2, OP1, OP2} 在另一个类中,我使用List,我想创建一个迭代器,它将指向特定DebateSignment中的特定Debateam,我想让它在所有任务中迭代所有团队,无缝地从一个任务到另一个任务 我该怎么做呢?您可以扩展一个列表实现,比如ArrayList,并添加一个方法来返回一个迭代器实现,该迭代器

我有两种Java数据结构:
其中一个称为DebateAssignment,有5个DebateTeam对象,每个对象与一个特定的枚举关联,该枚举包括

{JUDGE, PROP1, PROP2, OP1, OP2}
在另一个类中,我使用
List
,我想创建一个迭代器,它将指向特定DebateSignment中的特定Debateam,我想让它在所有任务中迭代所有团队,无缝地从一个任务到另一个任务


我该怎么做呢?

您可以扩展一个列表实现,比如ArrayList,并添加一个方法来返回一个迭代器实现,该迭代器实现满足您的需要


重写迭代器()方法可能不是它返回的迭代器的泛型类型的选项。

假设
DebateAssignment
具有类似

public Collection<DebateTeam> getDebateTeams();
公共集合getdebateeams();
您想要一个
迭代器

如果是这样的话,您是否想要类似于:

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...
}
公共类debateeamiterator实现迭代器{
私有迭代器iAssignment;
专用迭代器iTeam;
公共DebateTeamIterator(迭代器IASignment){
this.iAssignment=iAssignment;
if(iaSignment.hasNext())
iTeam=iaSignment.next().GetDebateams().iterator();
其他的
iTeam=newlinkedlist().iterator();
}
公共布尔hasNext(){
返回iTeam.hasNext();
}
公开辩论小组下一次(){
如果(!iTeam.hasNext())
iTeam=iaSignment.next().GetDebateams().iterator();
返回iTeam.next();
}
//…为简洁起见,删除了其他方法。。。
}

最简单的方法可能是:

List<DebateAssignment> list = ...
List<DebateTeam> dtList = new ArrayList<DebateTeam>();
for (DebateAssignment da : list) {
    dtList.addAll(da.getTeams());
}
return dtList.iterator();
List=。。。
List dtList=new ArrayList();
对于(拒绝签署da:清单){
addAll(da.getTeams());
}
返回dtList.iterator();
当然,您可以编写一个新类来实现“展平”嵌套迭代器的
Iterator
,但这有点复杂,因为您必须显式跟踪这两个迭代器。。。(详见克林顿的回答)。

单向,使用/:

返回Iterables.concat(Iterables.transform(赋值、,
新函数(){
公开募捐申请(授权转让){
返回赋值。getdebateeams();
}
}));

另一种方法是将数据存储为
Multimap
,然后简单地迭代
values()
entries()
视图。但是,该数据结构不会模拟法官/PROP1/etc.关联。

你能展示一下
DebateAssignment
的代码吗?读了你的问题后,我的大脑开始融化。我猜
Iterator
不是你要找的,你很清楚这一点。你能澄清一下你的问题吗?(如果只是为了重新冷冻可怜的罗曼的大脑呢?)事实上,我不明白他真正需要什么,但无论如何,扩大收藏是一种糟糕的做法。您可以围绕ArrayList创建一个包装类,并修饰一些方法,如iterator()(即,它是一个装饰器模式)。如果他真的想要一个第一类列表,我相信扩展要简单得多,因为对于组合,他必须实现所有列表方法并将它们委托给实际的列表。我确实同意这个要求很奇怪。我很容易被指责为极端偏见,但我不认为建议粘贴这么多行代码是一个好建议,因为这些代码都是不平凡的、未经验证的,而不是(你猜对了)使用一个已经花费了很多人天的库来彻底测试和修复它们的实现。谢谢!以前从未实现过迭代器,这个答案非常有用!
return Iterables.concat(Iterables.transform(assignments,
    new Function<DebateAssigment, Collection<DebateTeam>>() {
      public Collection<DebateTeam> apply(DebateAssignment assignment) {
        return assignment.getDebateTeams();
      }
    }));