在对Java对象集合进行迭代时——如何改变当前对象?
我将使用迭代器在Java中循环遍历对象集合。然而,我对使用迭代器有点困惑(习惯于使用for each循环)。假设我有这样的代码:在对Java对象集合进行迭代时——如何改变当前对象?,java,iterator,Java,Iterator,我将使用迭代器在Java中循环遍历对象集合。然而,我对使用迭代器有点困惑(习惯于使用for each循环)。假设我有这样的代码: Iterator<Organization> orgIter = orgs.iterator(); while (orgIter.hasNext()) { Organization orgObj = orgIter.next(); orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, ne
Iterator<Organization> orgIter = orgs.iterator();
while (orgIter.hasNext()) {
Organization orgObj = orgIter.next();
orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>()));
}
Iterator orgIter=orgs.Iterator();
while(orgIter.hasNext()){
Organization orgObj=orgIter.next();
orgObj.setChildOrgsTree(generateOrgChildTree(orgObj,new ArrayList());
}
我创建一个新对象,然后更改对象内的字段。我的计划是将我创建的iTroter的原始对象设置为我创建的这个对象的列表(上面没有显示这个列表,但我只是知道我需要它)
但是,如果我不必创建一个新对象来完成所有这些工作,那就容易多了。是否有一种方法可以获取当前对象并对其进行修改?如果您的迭代器迭代或实例,则限制较少。只要不更改列表的结构,就可以对返回的对象执行任何操作。当然,该特定对象的类应该允许对其进行修改,但我认为您可以添加必要的代码 另一方面,在不使迭代器对象无效的情况下,唯一允许的列表结构修改是使用删除当前元素,顺便说一句,这是一个可选操作。如果您试图直接修改列表,那么迭代器将无效,并且您将在下次尝试使用它时得到一个 此外,如果在上迭代,您通常会受到更大的约束:根据实际
Set
实现的详细信息,您通常无法修改对象中的任意字段。例如,hashCode()
返回的值在对象插入到HashSet
后不应更改
作为旁注,for each
循环在Java中只是使用迭代器的语法糖。如果您不打算使用迭代器.remove()
,请对每个循环使用,而不是显式迭代器,然后使用它。尝试以下操作:
for(Organization org : orgs)
org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>());
for(组织组织:组织)
setChildOrgsTree(generateOrgChildTree(org,newArrayList());
但是他没有说他有一个列表(只是说他有一个集合),如果你更改了hashCode
计算(使用HashSet
时)或可比计算中使用的字段,那么更改存储在集中的对象是非常糟糕的(使用树集时)。这样做会破坏Set
的语义,因为该值不再位于集合中。@MarkPeters:同意,我假设OP使用的是列表,因为Set
这个词不在问题的范围内。我将更新我的答案…+1这是正确的方法。使用foreach循环,因为你没有修改orgs
,只需修改diging the elements oforgs
。我想这是我应该做的…我试图扩展我的repotoire一点,但最好尽我所能。您的措辞令人困惑…您的代码在功能上与您接受的答案完全相同。在这两种情况下,创建的唯一对象是ArrayList,并且它们对于每种情况都是不同的组织实例。这就是方法!我很困惑,我正在组织对象上创建,并将其设置为与下一次迭代相等。我想,既然这是一个引用变量,我仍然在对同一个物理内存对象进行变异…声明一个变量和创建一个对象之间是有区别的。