Java实现List去重的方法详解

目录
  • 简介
  • 直接去重
  • 根据对象属性去重
    • 法1:TreeSet
    • 法2:stream+TreeSet
    • 所有代码

简介

本文用示例介绍Java的List(ArrayList、LinkedList等)的去重的方法。

List去重的方法

一共有这几种方法(按推荐顺序排列):

JDK8的stream的distinct

  • 转为HashSet(分不保持顺序和保持顺序两种)
  • 转为TreeSet
  • 使用retainAll/removeAll、contains、equals等基本方法

直接去重

package com.example.a;

import java.util.*;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(2);
        list.add(3);

        System.out.println("源数据:             " + list);
        System.out.println("stream:             " + stream(list));
        System.out.println("hashSetWithoutOrder:" + hashSetWithOrder(list));
        System.out.println("hashSetWithOrder:   " + hashSetWithOrder(list));
        System.out.println("treeSet:            " + treeSet(list));
    }

    //JDK1.8的stream去重
    private static List<Integer> stream(List<Integer> list) {
        return list.stream().distinct().collect(Collectors.toList());
    }

    //HashSet(不保持顺序)
    private static List<Integer> hashSetWithoutOrder(List<Integer> list) {
        HashSet<Integer> h = new HashSet<Integer>(list);
        return new ArrayList<>(h);
    }

    // 删除ArrayList中重复元素,保持顺序
    public static List<Integer> hashSetWithOrder(List<Integer> list) {
        Set<Integer> set = new HashSet<Integer>();
        List<Integer> newList = new ArrayList<Integer>();
        for (Integer element : list) {
            if (set.add(element))
                newList.add(element);
        }
        return newList;
    }

    //TreeSet(自动排序)
    public static List<Integer> treeSet(List<Integer> list) {
        TreeSet<Integer> set = new TreeSet<Integer>(list);
        return new ArrayList<>(set);
    }
}

执行结果

源数据:             [1, 3, 2, 3]
stream:             [1, 3, 2]
hashSetWithoutOrder:[1, 3, 2]
hashSetWithOrder:   [1, 3, 2]
treeSet:            [1, 2, 3]

根据对象属性去重

法1:TreeSet

Set<User> setByName = new TreeSet<User>((o1, o2) ->
		o1.getName().compareTo(o2.getName()));
setByName.addAll(list);
List<User> listByName = new ArrayList<>(setByName);
System.out.println(listByName);
//[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

Set<User> setByNameAndAge = new TreeSet<User>((o1, o2) -> {
	return (o1.getName() + o1.getAge()).compareTo((o2.getName() + o2.getAge()));
//            return o1.getName().compareTo(o2.getName()) == 0
//                    ? o1.getAge().compareTo(o2.getAge())
//                    : o1.getName().compareTo(o2.getName());
});
setByNameAndAge.addAll(list);
List<User> listByNameAndAge = new ArrayList<>(setByNameAndAge);
System.out.println(listByNameAndAge);
//[User{name='Pepper', age=20, Phone='123'},
// User{name='Tony', age=20, Phone='12'},
// User{name='Tony', age=22, Phone='1234'}]

法2:stream+TreeSet

List<User> streamByNameList = list.stream().collect(Collectors.collectingAndThen(
		Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new
));
System.out.println(streamByNameList);
//[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

List<User> streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(
		Collectors.toCollection(
            () -> new TreeSet<>(Comparator.comparing(o -> o.getName() + o.getAge()))), ArrayList::new
));
System.out.println(streamByNameAndAgeList);
//[User{name='Pepper', age=20, Phone='123'},
// User{name='Tony', age=20, Phone='12'},
// User{name='Tony', age=22, Phone='1234'}]

所有代码

package org.example.a;

import java.util.*;
import java.util.stream.Collectors;

class User {
    private String name;
    private Integer age;
    private String Phone;

    public User(String name, Integer age, String phone) {
        this.name = name;
        this.age = age;
        Phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return Phone;
    }

    public void setPhone(String phone) {
        Phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", Phone='" + Phone + '\'' +
                '}';
    }
}

public class Demo {
    public static void main(String[] args) {
        List<User> list = new ArrayList<User>() {{
            add(new User("Tony", 20, "12"));
            add(new User("Pepper", 20, "123"));
            add(new User("Tony", 22, "1234"));
        }};

        Set<User> setByName = new TreeSet<User>((o1, o2) ->
                o1.getName().compareTo(o2.getName()));
        setByName.addAll(list);
        List<User> listByName = new ArrayList<>(setByName);
        System.out.println(listByName);
        //[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

        Set<User> setByNameAndAge = new TreeSet<User>((o1, o2) -> {
            return (o1.getName() + o1.getAge()).compareTo((o2.getName() + o2.getAge()));
//            return o1.getName().compareTo(o2.getName()) == 0
//                    ? o1.getAge().compareTo(o2.getAge())
//                    : o1.getName().compareTo(o2.getName());
        });
        setByNameAndAge.addAll(list);
        List<User> listByNameAndAge = new ArrayList<>(setByNameAndAge);
        System.out.println(listByNameAndAge);
        //[User{name='Pepper', age=20, Phone='123'},
        // User{name='Tony', age=20, Phone='12'},
        // User{name='Tony', age=22, Phone='1234'}]

        List<User> streamByNameList = list.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(
                    () -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new
        ));
        System.out.println(streamByNameList);
        //[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

        List<User> streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(
                  () -> new TreeSet<>(Comparator.comparing(o -> o.getName() + o.getAge()))), ArrayList::new
        ));
        System.out.println(streamByNameAndAgeList);
        //[User{name='Pepper', age=20, Phone='123'},
        // User{name='Tony', age=20, Phone='12'},
        // User{name='Tony', age=22, Phone='1234'}]
    }
}

到此这篇关于Java实现List去重的方法详解的文章就介绍到这了,更多相关Java List去重内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 汇总Java中List 去重的 6 种方法

    目录 前置知识 无序集合 有序集合 有序和无序 方法1:contains判断去重(有序) 方法2:迭代器去重(无序) 方法3:HashSet去重(无序) 方法4:LinkedHashSet去重(有序) 方法5:TreeSet去重(无序) 方法6:Stream去重(有序) 总结 前言: 在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景.这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛? 不得不说,能提

  • Java关于List集合去重方案详细介绍

    1 常规去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个List集合,保持原来顺序 public static void ridRepeat1(List<String> list) { System.out.println("list = [" + list + "]"); List<String> listNew = new A

  • java list去重操作实现方式

    Java中的List是可以包含重复元素的(hash code 和equals),那么对List进行去重操作有两种方式实现: 方案一:可以通过HashSet来实现,代码如下: 复制代码 代码如下: class Student { private String id; private String name; public Student(String id, String name) { super(); this.id = id; this.name = name; } @Override pu

  • java 中如何实现 List 集合去重

    目录 1.自定义去重 2.利用 Set 集合去重 3.使用 Stream 去重 总结 前言: List 去重指的是将 List 中的重复元素删除掉的过程.此题目考察的是对 List 迭代器.Set 集合和 JDK 8 中新特性的理解与灵活运用的能力. List 去重有以下 3 种实现思路: 自定义方法去重,通过循环判断当前的元素是否存在多个,如果存在多个,则删除此重复项,循环整个集合最终得到的就是一个没有重复元素的 List: 使用 Set 集合去重,利用 Set 集合自身自带去重功能的特性,实

  • 简述Java List去重五种方法

    前言 去重,对于很多场合必不可少.写此篇文章是因为在之前做某个画面中,我在数据库中进行 Distinct 和 Order By 去重,发现影响效率,故此在后台先做去重处理:所以记录此文,已做参考: Num1:使用java8新特性stream进行List去重 public static void main(String[] args) { List list = new ArrayList(); list.add(10); list.add(11); list.add(14); list.add(

  • Java List中数据的去重

    list中数据的去重,通常使用将list转换为set,简单直接,因为set集合的特点就是没有重复的元素.需要考虑一下两种情况: 1.List集合中的数据类型是基本数据类型 可以直接将list集合转换成set,就会自动去除重复的元素. 如下示例: public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add(11); list.add(12); list.add(

  • Java实现List去重的方法详解

    目录 简介 直接去重 根据对象属性去重 法1:TreeSet 法2:stream+TreeSet 所有代码 简介 本文用示例介绍Java的List(ArrayList.LinkedList等)的去重的方法. List去重的方法 一共有这几种方法(按推荐顺序排列): JDK8的stream的distinct 转为HashSet(分不保持顺序和保持顺序两种) 转为TreeSet 使用retainAll/removeAll.contains.equals等基本方法 直接去重 package com.e

  • Java8利用Stream实现列表去重的方法详解

    目录 一. Stream 的distinct()方法 1.1 对于 String 列表的去重 1.2 对于实体类列表的去重 二. 根据 List<Object> 中 Object 某个属性去重 2.1 新建一个列表出来 2.2 通过 filter() 方法 一. Stream 的distinct()方法 distinct()是Java 8 中 Stream 提供的方法,返回的是由该流中不同元素组成的流.distinct()使用 hashCode() 和 eqauls() 方法来获取不同的元素.

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解 在Java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdir.txt"))); String str; while ((str = in.readLine())

  • Java AtomicInteger类的使用方法详解

    首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private static AtomicInteger count = new AtomicIn

  • Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过this(paras-)来调用其他的构造方法. 使用this来调用其他构造方法有如下几个约束. 1) 只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用. 2) 不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调

  • java 中迭代器的使用方法详解

    java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元素之间游走的责任交给迭代器,而不是聚合对象,实现了用户与聚合对象之间的解耦. 迭代器模式主要是通过Iterator接口来管理一个聚合对象的,而用户使用的时候只需要拿到一个Iterator类型的对象即可完成对该聚合对象的遍历.这里的聚合对象一般是指ArrayList,LinkedList和底层实现为数

  • java编程abstract类和方法详解

    抽象类和抽象方法常用知识点: (1)抽象类作为被继承类,子类必须实现抽象类中的所有抽象方法,除非子类也为抽象类. 也就是说,如果子类也为抽象类,可以不实现父类中的抽象方法.但是,如果有一个非抽象类 继承于抽象子类,需要实现抽象子类,抽象子类的抽象父类的所有抽象方法,新帐旧账一起算. (2)抽象类不能用final进行修饰. (3)抽象类不能被实例化,也就是说你用的时候不能通过new关键字创建. (4)抽象类中可以包含抽象方法和非抽象方法,抽象方法没有方法体,也就是没有具体实现, 只是定义了有什么功

  • Java线程三种命名方法详解

    这篇文章主要介绍了Java线程三种命名方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.实例化一个线程对象 Thread t = new Thread(); t.setName("甲"); 2.实例化一个线程对象的同时,通过构造方法对线程进行命名 Thread(Runnable r, String name) Thread t = new Thread(() -> {}, "甲"); 3.使用自定义

  • 在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解

    一.下载MySQL数据库并进行安装和配置 下载地址:https://dev.mysql.com/downloads/installer/ 二.下载JDBC连接器 下载地址:mysql-connector-java-8.0.22 下载好压缩包并解压后找到mysql-connector-java-8.0.22.jar文件放在自己指定的路径下. 三.在项目中导入jar包 用于测试数据库连接的测试类Test.java代码: import java.sql.Connection; import java.

随机推荐