Bic*_*ick 13 java copy-on-write
当我尝试使用迭代器从CopyOnWriteArrayList中删除元素时,我收到异常.我注意到它已记录在案
不支持对迭代器本身进行元素更改操作(删除,设置和添加).这些方法抛出UnsupportedOperationException.
(来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)
现在,令人惊讶的是我可以使用foreach迭代它并使用remove()函数.但后来我得到了着名的错误 - 当尝试使用for循环从列表中删除项目时 - 跳过被删除元素旁边的元素.那有什么建议吗?
Edw*_*rzo 21
迭代集合,选择要删除的所有元素并将其放入临时集合中.完成迭代后,使用removeAll方法从原始集合中删除所有找到的元素.
这会对你有用吗?我的意思是,不确定删除逻辑是否比算法中的更复杂.
编辑:我是个白痴.我错过了这是一个写入时复制列表的事实,因此每次删除都意味着一个新的副本.因此,如果有多个删除,我下面的建议可能不是最理想的.
与其迭代器不支持remove的任何其他列表相同,或者您没有使用迭代器的任何其他列表.为避免此错误,有三种基本技术可供考虑:
删除某些内容后递减索引(注意在下一次迭代之前不要对索引执行任何操作).为此,您显然必须使用for(int i=0; i <for循环的...样式,以便您可以操纵索引.
不知何故重复循环内部正在做的事情,而不是回到循环的顶部.一点点黑客 - 我会避免这种技术.
反向迭代列表(从头到尾,而不是从头到尾).我更喜欢这种方法,因为它是最简单的方法.
小智 5
由于这是 ,CopyOnWriteArrayList因此在使用 进行迭代时删除元素是完全安全的forEach。不需要花哨的算法。
list.forEach(e -> {
if (shouldRemove(e))
list.remove(e);
});
Run Code Online (Sandbox Code Playgroud)
编辑:当然,如果您想按引用而不是按位置删除元素,那当然可行。
| 归档时间: |
|
| 查看次数: |
16439 次 |
| 最近记录: |