300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 如何去掉list集合中重复元素大全

如何去掉list集合中重复元素大全

时间:2022-10-24 09:11:41

相关推荐

如何去掉list集合中重复元素大全

如何去掉list集合中重复元素大全

创建实体对象模拟集合方法一:遍历实体类的每一个属性方法二:利用list中contains方法去重方法三:java 8中流式去重操作方法四:HashSet去重

问题由来,在平常开发中我们经常用到导入功能,将模板中的数据封装成对象装到集合中,一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,重复的数据是不能导入并且及时给予提示!

创建实体对象

public class Student {private String stuId;private String stuName;private String sex;public Student(String stuId, String stuName, String sex) {this.stuId = stuId;this.stuName = stuName;this.sex = sex;}public String getStuId() {return stuId;}public void setStuId(String stuId) {this.stuId = stuId;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Student{" +"stuId='" + stuId + '\'' +", stuName='" + stuName + '\'' +", sex='" + sex + '\'' +'}';}}

模拟集合

List<Student> stuList = new ArrayList<Student>();stuList.add(new Student("S001", "张三", "女"));stuList.add(new Student("S002", "李四", "男"));stuList.add(new Student("S001", "张三", "女"));stuList.add(new Student("S002", "李四", "男"));stuList.add(new Student("S003", "王五", "男"));stuList.add(new Student("S004", "赵六", "女"));

方法一:遍历实体类的每一个属性

遍历实体类的每一个属性并判断是否重复。

测试方法:

/*** 方法一:遍历实体类的每一个属性,*/List<Student> newStus = new ArrayList<Student>();for (Student stu : stuList) {if(ObjectUtils.isEmpty(stuList)){newStus.add(stu);}boolean isSame = false;for (Student s : newStus) {if(s.getStuId().equals(stu.getStuId()) && s.getStuName().equals(stu.getStuName()) && s.getSex().equals(stu.getSex())){isSame = true;break;}}if(isSame == false){newStus.add(stu);}}// 输出结果System.out.println(newStus);}

结果:

[Student{stuId='S001', stuName='张三', sex='女'}, Student{stuId='S002', stuName='李四', sex='男'}, Student{stuId='S003', stuName='王五', sex='男'}, Student{stuId='S004', stuName='赵六', sex='女'}]

方法二:利用list中contains方法去重

利用list中contains方法去重,在使用contains()之前,必须要重写equals()方法!

Student重写equals():

@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Student student = (Student) obj;//当stuId、stuName、sex内容都相等的时候,才返回truereturn Objects.equals(stuId, student.stuId) &&Objects.equals(stuName, student.stuName) &&Objects.equals(sex, student.sex);}

测试方法:

/*** 方法二:利用list中contains方法去重*/List<Student> newList = new ArrayList<Student>();//使用contain判断,是否有相同的元素for (Student s : stuList) {if(!newList.contains(s)){newList.add(s);}}//输出结果System.out.println(newList);

结果:

[Student{stuId='S001', stuName='张三', sex='女'}, Student{stuId='S002', stuName='李四', sex='男'}, Student{stuId='S003', stuName='王五', sex='男'}, Student{stuId='S004', stuName='赵六', sex='女'}]

方法三:java 8中流式去重操作

利用 jdk1.8 中提供的Stream.distinct()列表去重,Stream.distinct()使用hashCode()和equals()方法来获取不同的元素,因此使用这种写法,对象需要重写hashCode()和equals()方法!

Student类重写hashCode()

@Overridepublic int hashCode() {return Objects.hash(stuId, stuName, sex);}

测试方法:

/*** 方法三:java 8中流式去重操作*/List<Student> newList = stuList.stream().distinct().collect(Collectors.toList());//输出结果System.out.println(newList.toString());

结果:

[Student{stuId='S001', stuName='张三', sex='女'}, Student{stuId='S002', stuName='李四', sex='男'}, Student{stuId='S003', stuName='王五', sex='男'}, Student{stuId='S004', stuName='赵六', sex='女'}]

方法四:HashSet去重

利用set集合的天然不支持重复元素特性,用set集合判重必须重写Object中的equals()和hashCode(),重写Object中的equals()和hashCode()同方法二和方法三种一致!

测试方法:

/*** 方法四:HashSet去重*/List<Student> newList = new ArrayList<Student>();//set去重HashSet<Student> set = new HashSet<>(stuList);newList.addAll(set);System.out.println(newList.toString());

结果:

[Student{stuId='S004', stuName='赵六', sex='女'}, Student{stuId='S002', stuName='李四', sex='男'}, Student{stuId='S003', stuName='王五', sex='男'}, Student{stuId='S001', stuName='张三', sex='女'}]

总结:四种方法去重效果一致,前三种方法输出的顺序保持一致(有序),第四种用HashSet去重打印的结果是无序的,因为set集合存放的数据本身就是无序且不可重复的!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。