List元素去重的六种方式

  • Post author:
  • Post category:其他


上周的时候完成公司交付的任务,突然间遇到了需要把重复元素去掉的功能,当时我的大脑飞速运转,努力回想以前学习关于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;
} 



版权声明:本文为Lockin_C原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。