6

我将使用迭代器循环遍历 Java 中的对象集合。但是,我对使用 Iterator 有点困惑(习惯于为每个循环使用)。假设我有这样的代码:

Iterator<Organization> orgIter = orgs.iterator();
while (orgIter.hasNext()) {
    Organization orgObj = orgIter.next();
    orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>()));
}

我创建一个新对象,然后更改对象内的字段。然后我的计划是设置我形成迭代器的原始对象等于我创建的这个对象的列表(上面没有显示列表,但我只是发现我需要它)。

但是,如果我不必创建一个新对象来完成所有这些工作,那就容易多了。有没有办法可以获取当前对象并对其进行变异?

4

2 回答 2

4

试试这个:

for(Organization org : orgs)
    org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>());
于 2012-06-21T12:29:03.067 回答
3

如果您的迭代器迭代 a ListorQueue实例,则限制较少。只要你不改变列表的结构,你可以对返回的对象做任何你想做的事情Iterator.next()。当然,该特定对象的类应该允许对其进行修改,但我认为您可以添加必要的代码...

另一方面,在不使 Iterator 对象无效的情况下,唯一允许的列表结构修改是使用 删除当前元素Iterator.remove(),顺便说一下,这是一个可选操作。如果您尝试直接修改列表,则迭代器将失效,并且您将ConcurrentModificationException在下次尝试使用它时得到一个。

此外,如果您在 a 上进行迭代Set,您通常会受到更多限制:根据实际Set实现的细节,您通常无法修改对象中的任意字段。例如,hashCode()一旦将对象插入HashSet...

作为旁注,for-eachJava 中的循环只是使用Iterator. 如果您不打算使用Iterator.remove(),只需使用for-each循环而不是显式迭代器并完成它。

于 2012-06-21T12:23:22.837 回答