Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
Collections 删除foreach中的项目_Collections_Foreach_Iterator_Immutability - Fatal编程技术网

Collections 删除foreach中的项目

Collections 删除foreach中的项目,collections,foreach,iterator,immutability,Collections,Foreach,Iterator,Immutability,是否允许您从当前在foreach循环中迭代的集合中删除项 如果是这样,正确的行为应该是什么?这实际上取决于语言。有些只是锤击一个数组,当你改变数组时爆炸。有些使用数组,不会爆炸。有些调用迭代器(更健壮)并且运行得很好。我可以使用非常复杂的集合来支持枚举器,这些枚举器跟踪集合的更改以保持位置信息正确。即使它确实需要做出一些妥协或假设。出于这个原因,大多数图书馆干脆将这种事情定为非法,或者在他们的文档中抱怨一些意想不到的行为 因此,最安全的方法是循环。收集对需要删除的内容的引用,然后使用收集的引用从

是否允许您从当前在foreach循环中迭代的集合中删除项


如果是这样,正确的行为应该是什么?

这实际上取决于语言。有些只是锤击一个数组,当你改变数组时爆炸。有些使用数组,不会爆炸。有些调用迭代器(更健壮)并且运行得很好。

我可以使用非常复杂的集合来支持枚举器,这些枚举器跟踪集合的更改以保持位置信息正确。即使它确实需要做出一些妥协或假设。出于这个原因,大多数图书馆干脆将这种事情定为非法,或者在他们的文档中抱怨一些意想不到的行为


因此,最安全的方法是循环。收集对需要删除的内容的引用,然后使用收集的引用从原始集合中删除项目。

您必须首先理解foreach的概念,实际上它取决于编程语言。但是作为一个一般性的回答,您应该避免在foreach中更改集合。通常,在
foreach
循环中修改集合是一个坏主意,因为程序不知道您的意图。您的意思是在更改之前循环检查所有项目,还是希望它只与新配置配合使用?那些已经循环的项目呢


相反,如果要修改集合,请创建要循环的预定义项列表,或使用索引循环。

某些集合(如哈希表和字典)没有“位置”的概念,并且通常无法保证迭代顺序。因此,在迭代时允许删除项是相当困难的。

只需使用标准for循环,向后迭代项集合,就可以在执行过程中删除项。

反向迭代并逐个删除项。。。那应该是正确的解决办法。

不,你不应该。正确的行为应该是发出信号,表明遇到了潜在的并发问题,但这是用您选择的语言完成的(抛出异常、返回错误代码、发出信号)

如果在对数据结构的元素进行迭代时修改数据结构,则迭代器可能不再有效,这意味着您有可能处理不再属于集合的对象。如果您想基于更复杂的符号过滤元素,可以这样做(在Java中):

List-toFilter=。。。;
列表阴影;
用于(T元件:toFilter)
如果(保留(元素))
添加(元素);
/*如果您将在与筛选器相同的上下文中使用toFilter*/
toFilter=阴影;
/*或者,如果您想就地修改toFilter,例如
*已作为方法参数给出
*/
toFilter.clear();
toFilter.addAll(阴影);

从正在迭代的集合中删除项的最佳方法是显式使用迭代器。比如说

List<String> myList = ArrayList<String>();
Iterator<String> myIt = myList.iterator();

while (myIt.hasNext()) {
    myIt.remove();
}
List myList=ArrayList();
迭代器myIt=myList.Iterator();
while(myIt.hasNext()){
myIt.remove();
}

编程语言?
List<String> myList = ArrayList<String>();
Iterator<String> myIt = myList.iterator();

while (myIt.hasNext()) {
    myIt.remove();
}