欢迎使用CSDN-markdown编辑器

来源:互联网 发布:手机图标软件 编辑:程序博客网 时间:2024/06/05 00:43

list循环删除指定元素

最近做一个项目,其中用到了删除重复对象的问题,自己找了些文章看了看,完美解决了这个问题。现将其总结下来。
JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历。
1:for循环便利

    public void test1(){        List<String> list = new ArrayList<String>();        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("b");        list.add("c");        for(int i=0;i<list.size();i++){            if(list.get(i).equals("a")){                list.remove(i);            }        }        System.out.println(list);    }

运行结果:[a,a,a,b,c]
这种的问题在于,在删除了某个元素后,list的大小会发生变化,而索引也在变化,所以会导致你在遍历的时候漏掉一些元素。
比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。
因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

2:增强for循环

    public void test2(){        List<String> list = new ArrayList<String>();        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("b");        list.add("c");        for(String str:list){            if(str.equals("a")){                list.remove(str);            }        }        System.out.println(list);    }

运行结果:Exception in thread “main” java.util.ConcurrentModificationException
可见是会抛出异常了,至于原因在http://blog.csdn.net/izard999/article/details/6708738中可以得到比较详细的解析。但是在删除后立刻break
则不会报错了。

3:迭代器

    public void test3(){        List<String> list = new ArrayList<String>();        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("b");        list.add("c");        Iterator<String> iterator = list.iterator();        while(iterator.hasNext()){            String str = iterator.next();            if(str.equals("a")){                iterator.remove();            }        }        System.out.println(list);    }

运行结果:[b, c]
这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的异常。

4.用set集合:set集合不能拥有重复元素

 public void test4(){        List<String> list = new ArrayList<String>();        Set<String> set = new HashSet<String>();        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("a");        list.add("b");        list.add("c");        for(String str:list){            set.add(str);        }        System.out.println(set);    }

运行结果:[a,b,c]

总结:如果是删除特定一个元素呢,可以用for循环和增强for循环。如果是删除多个元素呢,用迭代器。如果是去除重复元素,可以转为set集合,当然如果元素是对象,则需要重写equals及hsahcode方法