`
meladet
  • 浏览: 27243 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

删除集合中的元素

    博客分类:
  • Java
阅读更多
    最近在工作中遇到一个问题,就是要在集合中Remove一个指定的Object,一开始犯了一个很可笑的错误,比如一个ArrayList array中有如下元素:”a”,”b”,”c”,”d”,”e”,要Remove其中的”c”
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();
   }
}
分享到:
评论
6 楼 liuqiang9861020 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--; //前移处理
   }   
}  

5 楼 liuqiang9861020 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--   
   }   
}  
4 楼 抛出异常的爱 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();
}
3 楼 cpdw 2009-07-11  
你倒着循环就没有问题了,呵呵
for (int i = array.size()-1; i >=0; i--) {   
   if (array.get(i).equals("c")) {   
       array.remove(i);   
   }   
}  
2 楼 rdcyash 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.
1 楼 fjlyxx 2009-07-10  
有个JAVA JSQL开源的  用于查询JAVA对象 和SQL一样的 性能没测试过 可以用这个看看

相关推荐

    C#在foreach遍历删除集合中元素的三种实现方法

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    C#遍历List并删除某个元素的方法

    当我们需要遍历List并根据条件删除特定元素时,需要注意正确的方法,以避免在遍历过程中出现错误。以下将详细介绍如何在C#中遍历List并删除元素,包括正序和倒序遍历的技巧。 首先,我们来看一下错误的遍历方式。...

    使用Iterator接口遍历集合元素

    2. 当使用 Iterator 来迭代访问 Collection 集合元素时,Collection 集合里的元素不能被改变,只有通过 Iterator 的 remove 方法来删除上一次 next 方法返回的集合元素才可以。否则将会引发 java.util....

    java中关于集合的操作

    - **容量与大小**: `size()`返回集合元素数量,`ensureCapacity()`预先设定容量。 4. **集合转换**: - `toArray()`:将集合转换为数组。 - `copyOf()`:Java 8引入,用于安全地创建数组副本。 5. **集合操作**...

    Java 实例 - 删除集合中指定元素源代码+详细指导教程.zip

    除了这些基本操作,Java集合框架还提供了`removeAll(Collection&lt;?&gt; c)`方法,用于删除集合中所有匹配指定集合的元素,以及`retainAll(Collection&lt;?&gt; c)`方法,保留那些存在于指定集合中的元素,其余的都会被删除。...

    在list集合中输入元素,去除重复的元素并输出

    根据给定文件的信息,本文将详细介绍如何在Java的List集合中去除重复元素的三种方法:使用for循环、使用迭代器以及利用HashSet的特性。 ### 一、使用for循环去除重复元素 这种方法的基本思想是通过双重循环来遍历...

    C++编程:建造集合类实训

    本文将详细讲解C++编程中集合类的实现,包括集合类的定义、添加元素、删除元素、判断集合是否为空或满、判断元素是否包含在集合中、计算集合中的元素总数、输出集合中的元素、求两个集合的交集和并集等操作。...

    c++程序设计实现集合交集并集差集.pdf

    该类中包含了多个成员函数,用于实现集合的基本运算,例如添加元素、删除元素、判断元素是否在集合中、输出集合等。 首先,我们定义了 int_set 类的构造函数,用于初始化集合的最大大小和当前大小。然后,我们定义...

    python内置的集合set中元素顺序-python基础教程:set(集合).pdf

    - 不可变性:集合中的元素不能被修改,尝试添加已存在的元素或删除不存在的元素会引发错误。 - 唯一性:集合内的元素必须是不可变的,并且不允许重复。尝试添加相同的元素只会保留一个,例如:`s = {'a', 'a', 'a'}`...

    删除JAVA集合中元素的实现代码

    删除JAVA集合中元素的实现代码 在 Java 编程中,删除集合中的元素是一个常见的问题。有时候,我们需要删除集合中的某些元素,那么就可以参考下面的代码。 在 Java 中,集合是不能在遍历时删除元素的。因为 List 在...

    删除数组中的元素vb6

    在VB6(Visual Basic 6)中,处理数组并删除特定元素是一项常见的编程任务。数组是一种数据结构,用于存储同一类型的数据集合。当需要从数组中移除某个元素时,通常需要采用一定的策略来实现这一操作,因为VB6的数组...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    当你在一个迭代器正在遍历集合的过程中添加或删除元素时,就会抛出这个异常。这个问题在单线程环境下不会出现,但在多线程并发场景下,如果多个线程同时修改一个集合,就可能导致`ConcurrentModificationException`...

    两个集合比较(新增、编辑、删除)

    本文将深入探讨如何比较两个集合,并关注在Java中使用List进行对比时的“新增”、“编辑”和“删除”操作。首先,我们需要理解集合的基本概念。集合是存储一组元素的数据结构,而List是一种有序的集合,允许重复元素...

    C#集合遍历时删除和增加元素的方法

    当我们需要在遍历集合的过程中删除或添加元素时,必须注意一些特定的策略,因为不是所有的集合类型都支持这种操作。这里我们将详细讨论如何在C#中处理这种情况,特别是在使用`LinkedList&lt;T&gt;`时。 首先,C#的标准...

    set集合判断集合中是否有无元素-Python入门教程笔记(五)集合(set)及函数.pdf

    删除集合中的元素,可以使用`remove()`或`discard()`方法。`remove()`会抛出异常如果尝试删除的元素不存在,而`discard()`则不会。例如: ```python name_set.remove('Gina') # 如果Gina不在集合中,将抛出异常 ...

    数据结构课程设计----集合的并、交和差运算

    这些操作对于集合的并、交、差运算至关重要,因为它们允许在链表中有效地查找、插入和删除元素。 集合的抽象数据类型进一步定义了创建集合、销毁集合、计算并集、交集、差集以及打印集合的操作。这些操作基于有序表...

    顺序表表示集合,实现集合的交、并、差运算

    - **A_B(A, D)**:实现集合A与集合D的差集操作,即从集合A中删除所有集合D中存在的元素。 - 遍历集合D的元素,并检查其是否存在于集合A中。 - 如果存在,则从集合A中删除该元素。 #### 3. 辅助函数 - **GetElem(L...

    实现Java删除一个集合的多个元素

    在Java编程中,删除集合元素是一项常见的操作,但必须遵循特定的规则,以避免出现异常。在本例中,我们探讨了如何在Java中安全地删除一个集合的多个元素,特别是涉及`for each`循环和`Iterator`时的注意事项。 首先...

Global site tag (gtag.js) - Google Analytics