是否允许您从当前在foreach循环中迭代的集合中删除项目?
如果是这样,那么正确的行为应该是什么?
答案 0 :(得分:3)
我可以使用相当复杂的集合来支持跟踪集合更改的枚举器,以保持位置信息的正确性。即使它做了一些妥协或需要做出假设。出于这个原因,大多数图书馆只是禁止这样的事情,或者对他们的文档中的意外行为进行嘀咕。
因此,最安全的方法是循环。收集对需要删除的内容的引用,然后使用收集的引用来删除原始集合中的项目。
答案 1 :(得分:1)
这实际上取决于语言。有些只是锤击数组并在更改该数组时爆炸。有些人使用数组而不会爆炸。有些人调用迭代器(它们更加强大)并继续运行。
答案 2 :(得分:1)
通常,修改foreach
循环中的集合是一个坏主意,因为程序不知道您的意图。您是想在更改之前遍历所有项目,还是希望它只是使用新配置?那些已经循环的物品呢?
相反,如果要修改集合,可以使预定义的项目列表循环,或使用索引循环。
答案 3 :(得分:1)
某些集合(如哈希表和字典)没有“位置”的概念,并且通常无法保证迭代的顺序。因此,在迭代时允许删除项目是非常困难的。
答案 4 :(得分:0)
你必须首先理解foreach的概念,实际上它取决于编程语言。但作为一般答案,你应该避免在foreach中改变你的收藏
答案 5 :(得分:0)
只需使用标准for循环,向后遍历项目集合,您就可以在删除项目时没有问题。
答案 6 :(得分:0)
反向迭代并逐个删除项目...这应该是正确的解决方案。
答案 7 :(得分:0)
如果在迭代其元素时修改数据结构,则迭代器可能不再有效,这意味着您可能会冒险处理不再属于集合的对象。如果你想根据一些更复杂的表示法过滤元素,你可以这样做(在Java中):
List<T> toFilter = ...;
List<T> shadow;
for ( T element : toFilter )
if ( keep(element) )
shadow.add(element);
/* If you'll work with toFilter in the same context as the filter */
toFilter = shadow;
/* Alternatively, if you want to modify toFilter in place, for instance if it's
* been given as a method parameter
*/
toFilter.clear();
toFilter.addAll(shadow);
答案 8 :(得分:0)
从正在迭代它的集合中删除项目的最佳方法是explitly使用迭代器。例如。
List<String> myList = ArrayList<String>();
Iterator<String> myIt = myList.iterator();
while (myIt.hasNext()) {
myIt.remove();
}