在java日常开发中,会遇到对ist进行去重处理的需求,下面对其解决方式进行浅析。
List 去重指的是将 List 中的重复元素删除掉的过程。
方式有3中实现思路,1通过循环判断当前元素是否存在多个,若存在多个,则删除此重复项,最后得到去重后的list,判断是否存在多个,注意需要重写equals和hash方法。2使用set集合去重,利用set集合自身自带的去重特性。3使用jdk8中stream流的去重功能。
实例1:循环判断可以通过for循环
public class DistinctTest {
public static void main(String[] args) {
// 创建并给 List 赋值
List<Person> list = new ArrayList<>();
list.add(new Person("李四", "123456", 20));
list.add(new Person("张三", "123456", 18));
list.add(new Person("王五", "123456", 22));
list.add(new Person("张三", "123456", 18));
// 去重操作
List<Person> newList = new ArrayList<>(list.size());
list.forEach(i -> {
if (!newList.contains(i)) { // 如果新集合中不存在则插入
newList.add(i);
}
});
// 打印集合
newList.forEach(p -> System.out.println(p));
}
}
class Person {
private String name;
private String password;
private int age;
public Person(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name) && Objects.equals(password, person.password);
}
@Override
public int hashCode() {
return Objects.hash(name, password, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
实例2:循环判断可以通过iterater循环
public static void main(String[] args) {
// 创建并给 List 赋值
List<Person> list = new ArrayList<>();
list.add(new Person("李四", "123456", 20));
list.add(new Person("张三", "123456", 18));
list.add(new Person("王五", "123456", 22));
list.add(new Person("张三", "123456", 18));
// 去重操作
Iterator<Person> iterator = list.iterator();
while (iterator.hasNext()) {
// 获取循环的值
Person item = iterator.next();
// 如果存在两个相同的值
if (list.indexOf(item) != list.lastIndexOf(item)) {
// 移除相同的值
iterator.remove();
}
}
// 打印集合信息
list.forEach(p -> System.out.println(p));
}
实例3:通过set集合
public static void main(String[] args) {
// 创建并给 List 赋值
List<Person> list = new ArrayList<>();
list.add(new Person("李四", "123456", 20));
list.add(new Person("张三", "123456", 18));
list.add(new Person("王五", "123456", 22));
list.add(new Person("张三", "123456", 18));
// 去重操作
HashSet<Person> set = new HashSet<>(list);
// 打印集合信息
set.forEach(p -> System.out.println(p));
}
实例4:使用stream
public static void main(String[] args) {
// 创建并给 List 赋值
List<Person> list = new ArrayList<>();
list.add(new Person("李四", "123456", 20));
list.add(new Person("张三", "123456", 18));
list.add(new Person("王五", "123456", 22));
list.add(new Person("张三", "123456", 18));
// 去重操作
list = list.stream().distinct().collect(Collectors.toList());
// 打印集合信息
list.forEach(p -> System.out.println(p));
}
测试结果:
Person{name='李四', password='123456', age=20}
Person{name='张三', password='123456', age=18}
Person{name='王五', password='123456', age=22}
推荐使用stream流的方式进行去重处理,使用jdk8的新特性,深刻理解其他的方式。