Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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_Iterator - Fatal编程技术网

在对Java对象集合进行迭代时——如何改变当前对象?

在对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

我将使用迭代器在Java中循环遍历对象集合。然而,我对使用迭代器有点困惑(习惯于使用for each循环)。假设我有这样的代码:

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 of
orgs
。我想这是我应该做的…我试图扩展我的repotoire一点,但最好尽我所能。您的措辞令人困惑…您的代码在功能上与您接受的答案完全相同。在这两种情况下,创建的唯一对象是ArrayList,并且它们对于每种情况都是不同的组织实例。这就是方法!我很困惑,我正在组织对象上创建,并将其设置为与下一次迭代相等。我想,既然这是一个引用变量,我仍然在对同一个物理内存对象进行变异…声明一个变量和创建一个对象之间是有区别的。