浏览 3231 次
锁定老帖子 主题:删除集合中的元素
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-10
for (int i = 0; i < array.size(); i++) { if (array.get(i).equals("c")) { array.remove(i); } } 上面的代码乍一看也没什么问题,如果只有一个”c”的话也可以正常Remove,但是如果有多个”c”的话,在Remove一次后,array的size就变动,导致最后整个array有一些元素没有遍历到,结果肯定就是错的。后来想想,平时遍历List时用的for-each方法,应该可以正常的Remove,于是把代码改成如下: for (String item : array) { if (item.equals("c")) { array.remove(item); } } 结果跟第一种方法一样,也是错的。没有办法,去翻Java官方文档。发现了文档里说的,要移除一个集合中的元素,要使用Iterators。 文档中说:Iterator.remove是在遍历集合过程中删除元素的唯一安全的方法,当迭代正在进行时,使用别的方法改变集合会引发不确定的行为。 并且在以下两种情况应该使用Iterator代替for-each: 1、 删除当前元素,for-each结构隐藏了Iterator,没有办法调用remove方法 2、 并行的遍历多个Collections 于是把代码在修改一下,这样总算对了: for (Iterator<String> it = array.iterator(); it.hasNext(); ) { String item = it.next(); if (item.equals("c")) { it.remove(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-10
有个JAVA JSQL开源的 用于查询JAVA对象 和SQL一样的 性能没测试过 可以用这个看看
|
|
返回顶楼 | |
发表时间:2009-07-10
May I :
public Collection<Object> removeObject(Collection<Object> collections, Object obj) { Set<Object> newSet = Sets.newHashSet(); for (final Object object : collections) { if (object != obj) { newSet.add(object); } } return Collections.unmodifiedCollection(newSet); } I guess it makes the code clear and both collections immutable. |
|
返回顶楼 | |
发表时间:2009-07-11
你倒着循环就没有问题了,呵呵
for (int i = array.size()-1; i >=0; i--) { if (array.get(i).equals("c")) { array.remove(i); } } |
|
返回顶楼 | |
发表时间:2009-07-13
最后修改:2009-07-13
cpdw 写道 你倒着循环就没有问题了,呵呵
for (int i = array.size()-1; i >=0; i--) { if (array.get(i).equals("c")) { array.remove(i); } } 正常的用法应该是下面这个样子吧 while(it.hasnext()){ tmp = it.next(); if(xxxx)it.remove(); } |
|
返回顶楼 | |
发表时间:2009-12-07
还有一种方法,顺序遍历array的时候如果删除了某个元素导致index偏移,可以每次remove后将index做前移处理:
for (int i = 0; i < array.size(); i++) { if (array.get(i).equals("c")) { array.remove(i); i-- } } |
|
返回顶楼 | |
发表时间:2009-12-07
liuqiang9861020 写道 还有一种方法,顺序遍历array的时候如果删除了某个元素导致index偏移,可以每次remove后将index做前移处理:
for (int i = 0; i < array.size(); i++) { if (array.get(i).equals("c")) { array.remove(i); i--; //前移处理 } } |
|
返回顶楼 | |