问题描述:在开发过程中,我们经常会面临对一个List集合进行去除重复元素的操作?
解决思路
1、重写一个对象中的hashCode方法equals方法
2、
方法1、List中的contians进行去除重复的操作
方法2、使用java8新特性distinct
方法3、利用HashSet特性
话不多说,直接上代码
1、首先建一个实体类,并重写HashCode和equals方法,参考如下:
public class Student {
private String name;
private String sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//集合去重的重点
@Override
public int hashCode() {
// TODO Auto-generated method stub
return Objects.hash(name, sex, age);
}
//集合去重的重点
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
Student stu = (Student) obj;
return Objects.equals(name, stu.name) && Objects.equals(sex, stu.sex) && Objects.equals(age, stu.age);
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
public Student(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
2、将以上说的去重的三种方法做成工具类ListUtils,减少以后工作量
/**
* List集合去除重复数据 ,通过List中的contians方法
去除List集合中重复数据 前提是需要重重写对象的 hashcode和equal方法
*
* @param <T>
* @param list
* @return
*/
public static <T> List<T> processDuplicateByContains(List<T> list) {
List<T> listAll = new ArrayList<T>();
for (T t : list) {
if (!listAll.contains(t)) {
listAll.add(t);
}
}
return listAll;
}
/**
* List集合去除重复数据 , 通过List中的contians方法去除
List集合中重复数据 前提是需要重重写对象的 hashcode和equal方法
*
* @param <T>
* @param list
* @return
*/
public static <T> List<T> processDuplicateByHashSet(List<T> list) {
List<T> listAll = new ArrayList<T>();
HashSet<T> hashSet = new HashSet<T>(list);
listAll.addAll(hashSet);
return listAll;
}
/**
* List集合去除重复数据 ,通过HashSet方法去除List集合中重复数据
前提是需要重重写对象的 hashcode和equal方法
*
* @param <T>
* @param list
* @return
*/
public static <T> List<T> processDuplicateByStream(List<T> list) {
List<T> listAll = (List<T>) list.stream().distinct().collect(Collectors.toList());
return listAll;
}
3、实体类,工具类完毕,我们开始些测试代码
/**
* List出去重复操作类
*
* @author jack
*
*/
public class Repeat {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("小米", "男", 18));
list.add(new Student("小海", "男", 20));
list.add(new Student("小红", "女", 28));
list.add(new Student("小米", "男", 18));
list.add(new Student("小米", "男", 18));
List<Student> list2 = ListUntils.processDuplicateByContains(list);
List<Student> list3 = ListUntils.processDuplicateByHashSet(list);
List<Student> list4 = ListUntils.processDuplicateByStream(list);
for (Student stu : list4) {
System.out.println(stu);
}
}
}
执行结果
完成,收工。