上周的时候完成公司交付的任务,突然间遇到了需要把重复元素去掉的功能,当时我的大脑飞速运转,努力回想以前学习关于list的知识,后来,我发现已经忘得差不多了,所以我就找到了这篇文章,说的很详细。本来打算当时就记笔记的,后来无奈太忙了,所以拖了一周多才完成。
以下将通过六种方式将list集合内的元素去重,选择一个简单的方法记住它吧!


这篇文章参考了很多资料,感谢老师们的贡献,原文链接在这儿  
【List数据去重的五种有效方法】

目录

    可以自动排序的: 

方法一:利用TreeSet集合特性保持顺序一致去重

    不可自动排序的:

方法二:借助Set的特性进行去重

方法三:利用LinkedHashSet集合去重

方法四:使用list.contains()对全部元素进行判断

方案五: 使用Java8特性去重

方法六:使用list自身方法remove()–>不推荐


方法一:利用TreeSet集合特性排序+去重

TreeSet可以将字符串类型的数据按照字典顺序进行排序,首字母相同则看第二位

public static List<String> delRepeat1(List<String> list) {
    List<String> strings = new ArrayList<>(new TreeSet<>(list));
    return strings;
}

原:22    11    33    55    66    22    33    66

去重后:11    22    33    55    66    


方法二:借助Set的特性进行去重

由于Set的特性是无需且不可重复,我们利用这个特性进行两部操作
(1)把list放入set中
(2)把set还回list里

public static List<String> distinct(List<String> list) {
    List doubleList = new ArrayList();
    if(list.size()>0&&list != null){ //判断传入的list是否为空
        Set set = new HashSet(); //新建一个HashSet
        set.addAll(list); //list里的所有东西放入set中 进行去重
        doubleList.addAll(set); //把去重完的set重新放回list里
    }
    return doubleList;
}

原:22    11    33    55    66    22    33    66

去重后:22    11    33    55    66    


方法三:利用LinkedHashSet集合去重

经过验证之后发现,LinkedHashSet虽然可以去重,但是根据他的特性,他不能对数据进行排序,只能维持原来插入时的秩序
就因为这个知识论坛还有吵架的~

 public static List<String> delRepeat1(List<String> list) {
        List<String> listNew2 = new ArrayList<String>(new LinkedHashSet<String>(list));
        return listNew2;
    }

原:22    11    33    55    66    22    33    66

去重后:22    11    33    55    66    


方法四:使用list.contains()对全部元素进行判断

为了探究contains()方法的作用,我特意用List和String两种类型分别尝试了一下
结果长这样

String aaa = "aaa"; //声明一个String
String aa = "aa"; //再声明一个不同的String
boolean b = aaa.contains(aa); //比较一下 结果为true

List<String> listA = new ArrayList<String>(); //新建一个list
listA.add("aaa"); //添加一个String类型的元素
boolean b = listA.contains("aa"); //比较一下 结果为false


String类型会判断字符串里是否有相同的部分
List里则会判断是否有相同的元素
有了这样的结果,我们就可以用list.contains()的方法进行判断,然后将其添加到新的list当中,元素的顺序不发生改变

public static List<String> delRepeat(List<String> list) {
    List<String> listNew = new ArrayList<String>();
    for (String str : list) {
        if (!listNew.contains(str)) {
            listNew.add(str);
        }
    }
    return listNew ;
}

原:22    11    33    55    66    22    33    66

去重后:22    11    33    55    66    


方案五: 使用Java8特性去重

这部分没有深究,大概意思就是把list集合->Stream流,然后对流用distinct()去重,再用collect()收集

public static List<String> delRepeat(List<String> list) {
    List<String> myList = list.stream().distinct().collect(Collectors.toList());
    return myList ;
}

原:22    11    33    55    66    22    33    66

去重后:22    11    33    55    66    


方法六:使用list自身方法remove()–>不推荐

如果你的list里存的比较复杂,是一个List<Map<String,Object>>格式的情况,最无奈之举就是这种方法
主要操作是将同一个list用两层for循环配合.equals()方法,有相同的就用remove()方法剔除掉,然后得到一个没有重复数据的list

public static List<Map<String, Object>> distinct(List<Map<String, Object>> list) {
    if (null != list && list.size() > 0) {
        //循环list集合
        for  ( int  i  =   0 ; i  <  list.size()  -   1 ; i ++ )  {
            for  ( int  j  =  list.size()  -   1 ; j  >  i; j -- )  {
                // 这里是对象的比较,如果去重条件不一样,在这里修改即可
                if  (list.get(j).equals(list.get(i)))  {
                    list.remove(j);
                }
            }
        }
    }
    //得到最新移除重复元素的list
    return list;
} 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐