如何删除List中的重复元素

作为一名菜鸟,经常犯一些不可思议的错误,为了能让自己能不在犯低级错误,  也能让大佬指导一下我,遂记录以分享之。
复制代码

一个List中现在有1——10的元素若干个,需要删除指定名称为3的元素,分别打印删除前和删除后的list。

看到这个题目我的思路是循环遍历list,在遍历的时候,判断符合删除条件的元素,remove掉,这样就能删除掉list中所有符合删除条件的元素。  
复制代码

代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @ClassName DeleteElementOfList
 * @Description TODO
 * @Author 大大蜡笔小小新
 * @Date 2018-10-01 22:20
 * @Version 1.0
 **/
public class DeleteElementOfList {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(4);
        list.add(5);

        System.out.println("删除前:" + list);
        // 删除list中为3的元素
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == 3) {
                list.remove(list.get(i));
            }
        }
        System.out.println("删除后:" + list);


    }
}
复制代码

执行结果如下:

为什么会出现删除元素不干净的情况呢?

    这是因为在删除的过程中,list的大小是变化的,存在两个连续的重复元素时,在删除掉第一个符合删除条件元素的同时,list的长度(size)-1,索引也(index)-1,而for循环还是在原来的基础上(list的大小未删除元素时)进行遍历删除,刚好越过了第二个重复元素,故第二个重复元素未删除掉。  
复制代码

在删除的时候,我还犯了一个错误,使用foreach循环遍历时进行删除

代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @ClassName DeleteElementOfList
 * @Description TODO
 * @Author 大大蜡笔小小新
 * @Date 2018-10-01 22:20
 * @Version 1.0
 **/
public class DeleteElementOfList {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(4);
        list.add(5);

        System.out.println("删除前:" + list);
        // 删除list中为3的元素
        for (Integer num : list) {
            if (num == 3) {
                list.remove(num);
            }
        }
        System.out.println("删除后:" + list);


    }
}
复制代码

执行结果如下:

为什么会抛出异常呢?

foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。  
复制代码

那么怎么才能正确的删除掉指定的元素呢?

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @ClassName DeleteElementOfList
 * @Description TODO
 * @Author 大大蜡笔小小新
 * @Date 2018-10-01 22:20
 * @Version 1.0
 **/
public class DeleteElementOfList {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(4);
        list.add(5);

        System.out.println("删除前:" + list);
        // 删除list中为3的元素
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() == 3) {
                iterator.remove();
            }
        }
        System.out.println("删除后:" + list);


    }
}
复制代码

执行结果如下:

为什么现在删除正常呢?

如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行  
复制代码

本文是偶然遇到的问题,遂做以记录,我还自己创建了一个公众号,记录日常学习笔记以及遇到的问题,大家可以加一波关注,一起学习,共同进步。


添加个人微信,邀请加入微信群一起学习。

转载于:https://juejin.im/post/5bb2bad16fb9a05cf3714035

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值