上周的时候完成公司交付的任务,突然间遇到了需要把重复元素去掉的功能,当时我的大脑飞速运转,努力回想以前学习关于list的知识,后来,我发现已经忘得差不多了,所以我就找到了这篇文章,说的很详细。本来打算当时就记笔记的,后来无奈太忙了,所以拖了一周多才完成。
以下将通过六种方式将list集合内的元素去重,选择一个简单的方法记住它吧!
这篇文章参考了很多资料,感谢老师们的贡献,原文链接在这儿
【List数据去重的五种有效方法】
目录
可以自动排序的:
不可自动排序的:
方法四:使用list.contains()对全部元素进行判断
方法一:利用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;
}