栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么我的TreeSet不添加除第一个元素之外的任何内容?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么我的TreeSet不添加除第一个元素之外的任何内容?

如果将对象放在中

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
,那么您也需要检查该字段。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407042.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号