在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的新特性,深刻理解其他的方式。