Java 使用部分列表进行比较时的自定义哈希代码

Java 使用部分列表进行比较时的自定义哈希代码,java,equals,hashcode,Java,Equals,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

我正在尝试编写一个自定义哈希代码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;
    }
}
公共类人物{
字符串名;
列出属性;
@凌驾
公共布尔等于(对象o){
//如果名字相等,那么人就相等&如果>=2个属性相等
//这是我已经实施的
}
@凌驾
公共int hashCode(){
最终整数素数=59;
int结果=1;
result=(result*PRIME)+(this.name==null?0:this.name.hashCode());
//不确定在这里如何解释属性
返回结果;
}
}
我希望hashCode fn是这样的:
如果object1和object2根据其equals()方法相等,则它们还必须具有相同的哈希代码


不知道该怎么做?

实现equals/hashcCode方法契约的最简单方法是返回一个常量: @凌驾 public int hashCode(){return 13;}

否则,使用仅基于名称的哈希代码的解决方案将起作用。

因为,您无法通过实现
equals()
并依赖
集来消除重复来解决此问题。奇怪的事情可能会发生


因此,您必须自己对其进行编码。将列表中的第一项添加到新的消除重复列表中。然后,对于原始列表中的每个剩余项,将其与消除重复列表中已经存在的项进行比较,只有在通过非重复测试的情况下才添加它。

您的equals定义不可传递,因此无效。你可以有a==b和b==c,但不能有a==c。@OliCharlesworth谢谢你的回复。是的,你说得对。那我该怎么处理这个案子呢?我基本上有一个列表&我想根据上述标准删除重复项。问题是,因为你没有及物性,你没有一个连贯的“重复”定义。在我的a、b、c示例中,哪些应该删除?如果@OliCharlesworth的精彩评论不清楚,想象一下如果
a
b
c
具有属性
[1,2,3]
,[
2,3,4
]和
[3,4,5]
。哪些是重复的?明白你的意思了。考虑要排序的列表&优先级(a)>优先级(b)>优先级(c)。b应移除。所以首先我保留a,现在b应该被删除,因为它和a相似,现在c可以保留,因为a和c不同。谢谢!。看起来这是我在这里的唯一选择。这不会解决非传递equals方法的根本问题。不会,但它将回答如何实现满足equals/hashCode契约的hashCode方法的问题。