【问题标题】:TreeSet and equals functionTreeSet 和 equals 函数
【发布时间】:2010-09-07 03:15:13
【问题描述】:
有一个 Java bean 对象根据特定标准(标准 A)实现了equals 函数。我需要根据另一个标准(标准 B)识别唯一对象。由于equals 函数使用标准A,我不能使用HashSet。所以我想将TreeSet 与基于标准B 的自定义Comparator 一起使用。我的问题是,是否允许这样做?这种方法有什么问题吗?
谢谢。
【问题讨论】:
标签:
java
equals
comparator
treeset
【解决方案1】:
以下是 Oracle Java 的一些指南:
请注意,由 a 维护的排序
设置(无论是否显式
比较器提供)必须是
与equals一致
正确实现 Set 接口。
(请参阅 Comparable 或 Comparator for a
符合的精确定义
等于。)之所以如此,是因为 Set
接口是根据定义的
等于操作,但是一个 TreeSet
实例执行所有键比较
使用它的 compareTo(或比较)
方法,所以两个键被视为
用这种方法相等的是,从
集合的立场,平等。这
集合的行为甚至是明确定义的
如果它的顺序与
等于;它只是不服从
Set 接口的通用合约。
我认为在技术方面,不,你没有任何问题。但是,在编码、可读性和可维护性方面,你必须小心,因为其他人可能会误用或误解你在做什么
【解决方案3】:
你可以把它们包装起来:
class BeanWrapper {
...
public boolean equals(Object other) {
return myBean.critB.equals(((Bean)other).critB);
}
}
然后把它们放在这样的集合中。