我正在尝试编写自定义hashCode fn,但我无法找到正确的方法。
public class Person {
String name;
List<String> attributes;
@Override
public boolean equals(Object o) {
// Persons are equal if name is equal & if >= 2 of attributes are equal
// This I have implemented
}
@Override
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = (result*PRIME) + (this.name == null ? 0 : this.name.hashCode());
//Not sure what to do here to account for attributes
return result;
}
}
我希望hashCode fn是这样的:
“如果object1和object2根据equals()方法相等,它们也必须具有相同的哈希码”
不确定该怎么做?
答案 0 :(得分:3)
作为Oli points out in the comments,您无法通过实施equals()
并依靠Set
为您重复删除来解决此问题。可能会发生奇怪的事情。
因此,你必须自己编码。将列表中的第一项添加到新的重复数据删除列表中。然后,对于原始列表中的每个剩余项目,将其与重复数据删除列表中已存在的项目进行比较,并且只有在通过非重复测试时才添加它。
答案 1 :(得分:-1)
完成equals / hashcCode方法的契约的最简单方法是返回一个常量: @覆盖 public int hashCode(){return 13;}
否则,只使用基于名称的哈希码的解决方案才有效。