避免在Set中添加重复条目

时间:2017-12-13 17:12:34

标签: java hashset

我这样做

1)检查我的HashSet中是否存在条目 2)如果是,则跳过 3)如果否,则添加

以下是代码。我的输出显示了Employee对象的重复条目,而不是整数类型。如何更正以下代码?

import java.util.*;

public class SetTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet <Employee> e1=new HashSet<Employee>();

        e1.add(new Employee(1,"bob"));
        e1.add(new Employee(2,"eric"));

        if(!e1.contains(new Employee(1,"bob")))
        {
            e1.add(new Employee(1,"bob"));
        }

        for(Employee e:e1) {
            System.out.println(e.getId()+" "+e.getName());
        }

        HashSet e2=new HashSet();
        e2.add(1);
        e2.add(2);
        e2.add(1);

        System.out.println(e2);



    }

}
class Employee{
    int id;
    String name;

    Employee(int id,String name) {
        this.id=id;
        this.name=name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

1 个答案:

答案 0 :(得分:2)

问题在于:

if(!e1.contains(new Employee(1,"aravind")))

您已添加了一个员工对象,其名称字段为&#34; Aravind&#34;以前的集合,但在这一行中,new Employee部分创建了一个全新的不同的员工,具有相同的名称 - 并且由于Java中的对象默认情况下通过其地址进行比较,这两个员工是不同的,即使他们的领域是相同的。

我相信您正在寻找的解决方案是覆盖Employee类的equalshashCode方法,以便只比较ID和名称,然后您的HashSet会报告说它已经有一名名叫Aravind和ID 1的员工。