将唯一对象放入java中的列表中

时间:2015-03-27 06:57:22

标签: java

我想根据对象的属性将唯一对象添加到列表中。

class Employee {
    protected long   employeeId;
    protected String firstName;
    protected String lastName;

    Employee(long employeeId,String firstName,String lastName){
        this.employeeId = employeeId;
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

我希望在唯一'employeeId''firstName'的基础上将对象插入到列表中,在将对象插入列表时,组合应该是唯一的。

3 个答案:

答案 0 :(得分:3)

如果您希望某些容器能够阻止您的Employee重复添加,您需要定义在Employee中计算equals的方式。

public class Employee {
//...
    @Override
    public boolean equals(Object obj) {
       if (!(obj instanceof Person))
            return false;
        if (obj == this)
            return true;

        Person rhs = (Person) obj;
        return new EqualsBuilder()
            // if deriving: .appendSuper(super.equals(obj))
            .append(employeeId, rhs.employeeId)
            .append(firstName, rhs.firstName)
            .append(lastName, rhs.lastName)
            .isEquals();
    }
}

如果您希望某些容器能够快速查找您的Employee,您需要定义如何在Employee中计算哈希码。

public class Employee {
//...
    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + employeeId;
        hash = hash * 31 + firstName.hashCode();
        hash = hash * 13 + lastName.hashCode();
        return hash;
    }
}

大多数现代IDE将为您提供重新分解。在两者中使用相同的字段,以便它们一起更改。

由于你不想要重复,你最好的选择是不使用ArrayList,而是注意哈希值,并为你强制执行唯一性。每当我在java中选择一个容器时,我都会看到这个:

enter image description here

要让所有这些都可用,您不仅需要实现hashcode and equals,还需要实现comparator

为了清楚起见,散列的要点是提供查找速度。等于点是定义哪些对象被认为是相同的。比较器的目的是为对象提供排序。

如果您想要包含不太常用的容器,请尝试以下方法:

enter image description here

答案 1 :(得分:1)

这可以通过覆盖equals()和hashCode()方法来实现 - 然后你可以转向在比较对象时使用这些方法的现有java.util集合类(如HashSet)。

答案 2 :(得分:1)

这里,等于()&重写hashCode()方法以满足给定的要求。

class Employee {
    protected long   employeeId;
    protected String firstName;
    protected String lastName;

    Employee(long employeeId,String firstName,String lastName){
        this.employeeId = employeeId;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public boolean equals(Object o){
        if(o == null) return false;
        if(!(o instanceof) Employee) return false;

        Employee other = (Employee) o;
        if(this.employeeId != other.employeeId)      return false;
        if(! this.firstName.equals(other.firstName)) return false;

        return true;
   }

    public int hashCode(){
        return (int) employeeId * firstName.hashCode();
    }
}

这里,如果两个Employee对象相等,它们也将具有相同的哈希码。但是,即使两个Employee对象仍然不能具有相同的哈希码。

Ex:哈希码是employeeId向下舍入为int。这意味着许多员工ID可能会产生相同的哈希码,但这些员工对象仍然不相同,因为他们没有相同的员工ID。