java——list<Employee>转set

  1. List 集合和Set 集合的区别
    (1) list 和 set 都继承了Collection。
    (2) list是有顺序的所以它的值是可以重复的
    (3)set 是无序的不能插入重复元素
  2. list转set注意事项:
    以下列测试代码为例
    员工类
public class Employee {
    private int id;
    private String name;
    private String department;
    private double money;
    public Employee(int id, String name, String department, double money) {
        this.id = id;
        this.name = name;
        this.department = department;
        this.money = money;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return id== employee.id;
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
    @Override
    public String toString() {
        return  "工号=" + id +
                ", 姓名='" + name + '\'' +
                ", 部门='" + department + '\'' +
                ", 工资=" + money ;
    }
}

测试代码:

public class MainClass {
    public static boolean isRepeat(List<Employee> list) {
        Set<Employee> set=new HashSet<>(list);
        if(list.size()!=set.size())
            return true;
        return false;
    }
    public static void main(String[] args) {
        List<Employee> list=new ArrayList<>();
        list.add(new Employee(10001,"小王","销售部",5000));
        list.add(new Employee(10002,"小赵","销售部",6500));
        list.add(new Employee(10001,"Alan","研发部",15000));
        List<Employee> EmployeeList = new ArrayList<>(new HashSet<>(list));//转换
        
        System.out.println("去重之前是否有重复工号:"+(isRepeat(list)?"有":"没有"));
        list.forEach(a->{
            System.out.println(a);
        });

        System.out.println("去重之后是否有重复工号:"+(isRepeat(EmployeeList)?"有":"没有"));
        EmployeeList.forEach(a->{
            System.out.println(a);
        });
    }
}

在这里插入图片描述
这里去掉的是工号为10001的Alan,因为它与小王的工号重复了,为什么只根据工号去重?答案在Employee 里重写的equals和hashCode方法:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return id == employee.id;
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

而关键在于equals里的return id == employee.id;和hashCode里的return Objects.hash(id);两句,亲测,这两个方法需要保持一致,不然不起效果,具体为什么,还等待我去深究。
同理,如果你想去掉重复部门,只需要把这两方法的id换成department ,如果需要去掉姓名和部门均一样的数据,只需要改成 return name==employee.name&&department ==employee.department 和return Objects.hash(name,department );

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值