zoukankan      html  css  js  c++  java
  • 使用Set集合对List集合进行去重

    /**
    * 使用Set集合对List集合进行去重
    **/
    public class SetTest {
    /**
    * List集合的泛型为Integer类型
    *
    * @author hongwei.lian
    * @date 2018年3月9日 下午11:32:53
    */
    @Test
    public void testListToSet1() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(1);
    Set<Integer> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    /**
    * List集合的泛型为String类型
    **/
    @Test
    public void testListToSet2() {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("a");
    Set<String> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    
    /**
    * List集合的泛型为自定义类型User
    * 需求是userCode一样的便是同一个对象
    **/
    @Test
    public void testListToSet3() {
    List<User> list = new ArrayList<>();
    list.add(new User(1,"用户一","600001"));
    list.add(new User(2,"用户二","600002"));
    list.add(new User(3,"用户一","600001"));
    list.add(new User(4,"用户一","600001"));
    Set<User> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    }

     

    上面测试使用到的User类源码:

    package com.qdfae.jdk.domain;
    
    import java.io.Serializable;
    
    /**
    * User实体类
    *
    * @author hongwei.lian
    * @date 2018年3月10日 上午12:33:22
    */
    public class User implements Serializable {
    private static final long serialVersionUID = -7629758766870065977L;
    
    /**
    * 用户ID
    */
    private Integer id;
    /**
    * 用户姓名
    */
    private String userName;
    /**
    * 用户代码
    */
    private String userCode;
    public User() {}
    public User(Integer id, String userName, String userCode) {
    this.id = id;
    this.userName = userName;
    this.userCode = userCode;
    }
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getUserName() {
    return userName;
    }
    
    public void setUserName(String userName) {
    this.userName = userName;
    }
    
    public String getUserCode() {
    return userCode;
    }
    
    public void setUserCode(String userCode) {
    this.userCode = userCode;
    }
    
    @Override
    public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", userCode=" + userCode + "]";
    }
    }

    依次运行上面三个方法的结果是:
    testListToSet1()方法结果:

     

    testListToSet2()方法结果:

     

    testListToSet3()方法结果:

    上面的testListToSet1()方法和testListToSet2()方法可以去重,那为什么testListToSet3()方法就不能去重呢?仔细想想就会知道,两个对象的地址值不一样,怎么会认为是相同的去重呢,再往深处想,就会想到Object类的hashCode()方法和equals()方法,这两个方法决定了两个对象是否相等。Integer类和String类之所以可以进行去重,是因为这两个类都重写了父类Object类中的hashCode()方法和equals()方法,具体的代码可以去查看JDK源码,这里不再赘述。到这里我们就知道User对象不能去重的原因所在,那么我们根据需求在User类中重写hashCode()方法和equals()方法

    /**
    * User实体类
    *
    */
    public class User implements Serializable {
    private static final long serialVersionUID = -7629758766870065977L;
    
    /**
    * 用户ID
    */
    private Integer id;
    /**
    * 用户姓名
    */
    private String userName;
    /**
    * 用户代码
    */
    private String userCode;
    public User() {}
    public User(Integer id, String userName, String userCode) {
    this.id = id;
    this.userName = userName;
    this.userCode = userCode;
    }
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getUserName() {
    return userName;
    }
    
    public void setUserName(String userName) {
    this.userName = userName;
    }
    
    public String getUserCode() {
    return userCode;
    }
    
    public void setUserCode(String userCode) {
    this.userCode = userCode;
    }
    /**
    * 针对userCode重写hashCode()方法
    */
    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((userCode == null) ? 0 : userCode.hashCode());
    return result;
    }
    
    /**
    * 针对userCode重写equals()方法
    */
    @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    User other = (User) obj;
    if (userCode == null) {
    if (other.userCode != null)
    return false;
    } else if (!userCode.equals(other.userCode))
    return false;
    return true;
    }
    
    @Override
    public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", userCode=" + userCode + "]";
    }
    }
    我们再次运行testListToSet3()方法结果:
  • 相关阅读:
    opencv —— copyTo 设置与操作感兴趣区域(ROI)
    opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素
    opencv —— getTickCount、getTickFrequency 计时函数
    opencv —— setMouseCallback 响应鼠标操作事件
    opencv —— createTrackbar、getTrackbarPos 滑动条的创建和使用
    opencv —— imread、namedWindow & imshow、cvtColor、imwrite 加载、显示、修改、保存图像
    redis缓存穿透,缓存击穿,缓存雪崩问题
    NoSQL技术
    日期处理
    WIN2008中部署网站后样式及JS加载不了(转载)
  • 原文地址:https://www.cnblogs.com/pypua/p/10783701.html
Copyright © 2011-2022 走看看