已实现hashCode(),但keepAll()仍无法按预期工作

时间:2019-01-27 18:50:11

标签: java set hashset

我有一个Doctor对象,每个对象都有一个唯一的属性“ docMobile”(主键)。我制作了两个医生的 LinkedHashSets (doctorsByLoc和doctorsByAvail)。现在当我做一个

doctorsByLoc.retainAll(doctorsByAvail) 

在两个集合上,即使它们具有相同的医生,它也会删除所有元素

我在我的医生类中实现了hashCode()方法。我还单独打印了这些集合,以检查集合中是否包含相同的元素。

public class Doctor{
    String docName;
    long docMobile;
    String docLocation;
    int docDays;

    @Override
    public int hashCode() {
        return Long.hashCode(docMobile);
    }
}

然后在servlet中的某个地方发生这种情况

public static void main(String[] args){
    Set<Doctor> doctorsByLoc = new LinkedHashSet<>();
    Set<Doctor> doctorsByAvail = new LinkedHashSet<>();

    doctorsByLoc.add(d1);
    doctorsByLoc.add(d2);
    doctorsByLoc.add(d3);

    doctorsByAvail.add(d1);
    doctorsByAvail.add(d2);
    doctorsByAvail.add(d3);

    System.out.println("Before retain All "+doctorsByLoc.size());
    for(Doctor d:doctorsByLoc){ 
        System.out.println(d.getdocName());
    }
    doctorsByLoc.retainAll(doctorsByAvail);
    System.out.println("After retain All"+doctorsByLoc.size());
    for(Doctor d:doctorsByLoc){ 
        System.out.println(d.getdocName());
    }
}        


Actual output:
Before retain All 3
d1's name
d2's name
d3's name
After retain All 0

我该如何解决我的哈希码方法,以便医生留下来。 我曾尝试在返回之前打印出哈希码,然后得到了一对类似的哈希码作为输出。

1 个答案:

答案 0 :(得分:3)

您没有正确覆盖equals。您应该按如下所示对其进行覆盖:

@Override
public boolean equals (Object other) // Not "Doctor other"
{
    // implementation here
}