对于同一对象,Equals方法不返回true

时间:2018-03-15 12:42:00

标签: java spring

@IdClass=(value = TripleKey.class)
class Triple {
   String subject;
   String predicate;
   String object;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;

        Triple triple = (Triple) o;

        if (!subject.equals(triple.subject)) return false;
        return predicate.equals(triple.predicate);
    }

    @Override
    public int hashCode() {
        int result = super.hashCode();
        result = 31 * result + subject.hashCode();
        result = 31 * result + predicate.hashCode();
        return result;
    }
}

我的目标是:

{
    "subject": "http://www.someurl.com/thing/resources/<owner>#SenMLJSON",
    "predicate": "probes_in",
    "object":"http://sweet.jpl.nasa.gov/2.3/matrSediment.owl#clay"

}

{
        "subject": "http://www.someurl.com/thing/resources/<owner>#SenMLJSON",
        "predicate": "probes_in",
        "object":"http://sweet.jpl.nasa.gov/2.3/matrSediment.owl#sand"

    }

当我尝试以下操作时,我仍然有重复:

public static List<Triple> mergeTripleLists(List<Triple> oldList, List<Triple> newList) {
        Set<Triple> tripleSet = new HashSet<>(oldList);
        tripleSet.removeAll(newList);
        tripleSet.addAll(newList);
        return new ArrayList<>(tripleSet);

    }

2 个答案:

答案 0 :(得分:2)

问题在于:

if (!super.equals(o)) return false;

删除后应该可以使用。

答案 1 :(得分:1)

问题是调用超类的equals方法,它使用对象引用来测试相等性,所以用

删除该行
!super.equals(o)

您还需要删除对超类的hashCode方法的调用。