我找不到任何关于此的话题。我想知道在循环过程中是否可以安全地更改列表类的引用:
Tree minimalTree = someTree;
for (Tree st : minimalTree.getSubtrees()) {
if (condition)
minimalTree = st;
}
迭代器是否会重置并重新启动新引用?
编辑:我忘了说:这段代码适用于我想缩小搜索树中元素的情况,比方说,包含某些元素的小树。在这种情况下,继续只查看“minimalTree”的内部结构而不是整个“someTree”结构会更快。
答案 0 :(得分:6)
不,迭代不会被重置。根据{{3}}:
增强的for语句相当于一个基本的for语句 形式:
for (I #i = Expression.iterator(); #i.hasNext(); ) { {VariableModifier} TargetType Identifier = (TargetType) #i.next(); Statement }
该定义很明显迭代器只在循环的第一次迭代之前初始化一次。
在这方面,使用增强的for语句迭代数组时的行为类似。
但我个人认为这种做法很差,因为它使代码难以理解。
答案 1 :(得分:2)
实际上,有两个问题:
我想知道在循环过程中是否可以安全地更改列表类的引用:
是的,这是安全的。为安全起见,我的意思是:更改引用不会干扰已经运行的循环。
迭代器是否会重置并重新启动新引用?
不,迭代器永远不会重置。这与安全完全相反。
在我看来,在循环中更改迭代器或集合变量不是一个好习惯。它使代码更难理解,并且可能结果不是你所期望的那样(就像在你的情况下我理解你期望循环开始重新评估集合)。
在您的情况下,封装在方法中并在子树上递归调用它:
Tree findMinimalTree(Tree tree) {
for (Tree st : tree.getSubtrees()) {
if (condition)
return findMinimalTree(st);
}
return tree;
}