TreeSet和equals函数

时间:2010-09-07 03:15:13

标签: java equals comparator treeset

有一个Java bean对象,它根据某些标准实现了equals函数(标准A)。我需要根据其他标准识别唯一对象(标准B)。由于equals函数使用条件A,因此我无法使用HashSet。所以我想到TreeSet使用基于标准B的自定义Comparator。我的问题是,是否可以这样做?这种方法有什么问题吗?

谢谢。

3 个答案:

答案 0 :(得分:15)

以下是Oracle Java的一些指南:

  

注意由a维护的排序   设置(无论是否明确   提供比较器)必须   如果是,则与等于一致   正确实现Set接口。   (参见Comparable或Comparator for a   精确定义符合   等于。)这是因为Set   接口是根据的定义的   等于操作,但是一个TreeSet   instance执行所有关键比较   使用compareTo(或比较)   方法,所以两个键被认为   等于这个方法是,从   集合的立场,平等。该   集合的行为甚至是明确定义的   如果它的排序不一致   等于;它只是没有服从   Set接口的一般合约。

我认为在技术方面,不,你没有任何问题。但是,在编码,可读性和可维护性方面,你必须要小心,因为其他人可能会滥用或误解你在做什么

答案 1 :(得分:1)

如果经常执行搜索并很少添加元素,请考虑将它们保存在按条件B排序的List中并使用Collections.binarySearch

答案 2 :(得分:1)

你可以包装它们:

class BeanWrapper {

 ...

 public boolean equals(Object other) {
  return myBean.critB.equals(((Bean)other).critB);
 }

}

然后将它们放在那里。