如果将对象放在中
TreeSet,则需要
Comparator在构造函数中提供接口的实现,或者需要使对象属于实现的类
Comparable。
您说您是
compareTo从
Comparable接口实现的,但是在您的评论中您说的不是,所以假设您只是
return0;在
compareTo方法中,我是否正确?那将解释您的问题,因为TreeSet会根据
compareTo方法结果认为您的所有对象都是“相同的” 。
基本上,在中
TreeSet,您的对象按已排序的顺序维护,并且排序由Comparable /
Comparator方法的结果确定。这用于在TreeSet中快速查找重复项,并具有额外的好处,即在TreeSet上进行迭代时,您可以按排序顺序获得结果。
的Javadoc
TreeSet说:
请注意,如果要正确实现接口,则由一个集合(无论是否提供显式比较器)维护的顺序必须 等于equals
Set。
最简单的方法是让您的
equals方法调用
compareTo方法并检查结果是否为
0。
对于您的
PatientImpl班级,我假设您要首先按患者的姓氏,其名然后对班级中的其他字段进行排序。
您可以实现这样的
compareTo方法:
@Overridepublic int compareTo(Object o) { if (!(o instanceof Patient)) return -1; Patient temp = (Patient) o; int r = this.lastName.compareToIgnoreCase(temp.getLastName()); if (r == 0) r = this.firstName.compareToIgnoreCase(temp.getFirstName()); if (r == 0) r = this.SSN.compareToIgnoreCase(temp.getSSN()); if (r == 0) r = this.dob.toString().compareToIgnoreCase(temp.getDOB().toString()); if (r == 0) r = Integer.compare(this.getID(), temp.getID()); return r;}我相信这可以解决您描述的问题。我会建议你阅读了关于(Javadoc中或书籍)
TreeSet和
HashSet和的重要性
equals,
compareTo和
hashCode方法。如果要将对象放在集合或地图中,则需要了解这些对象才能正确实现。
注意 我基于
compareTo您的
equals方法此方法。您正在通过首先调用toString来比较出生日期。这不是一个很好的方法-
您可以
equals直接使用java.util.Date中的方法。在compareTo方法中,问题变得更加严重,因为当您按字母顺序对日期进行排序时,日期无法正确排序。
java.util.Date还实现了,
Comparable因此您可以将方法中的比较替换为:
if (r == 0) r = this.dob.compareTo(temp.getDOB());
另外,如果任何字段可以是
null,那么您也需要检查该字段。



