我想根据对象的属性将唯一对象添加到列表中。
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'
的基础上将对象插入到列表中,在将对象插入列表时,组合应该是唯一的。
答案 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中选择一个容器时,我都会看到这个:
要让所有这些都可用,您不仅需要实现hashcode and equals,还需要实现comparator。
为了清楚起见,散列的要点是提供查找速度。等于点是定义哪些对象被认为是相同的。比较器的目的是为对象提供排序。
如果您想要包含不太常用的容器,请尝试以下方法:
答案 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。