9

有一个 Java bean 对象已经实现了equals基于特定标准(Criteria A)的功能。我需要根据另一个标准(标准 B)识别唯一对象。由于该equals函数使用标准 A,我不能使用HashSet. 所以我想使用基于标准 B 的TreeSet自定义。我的问题是,是否允许这样做?Comparator这种方法有什么问题吗?

谢谢你。

4

3 回答 3

17

以下是 Oracle Java 的一些指南:

请注意,如果要正确实现 Set 接口,集合维护的顺序(无论是否提供显式比较器)必须与 equals 一致。(参见 Comparable 或 Comparator 以获得与 equals 一致的精确定义。)这是因为 Set 接口是根据 equals 操作定义的,但是 TreeSet 实例使用其 compareTo(或 compare)方法执行所有键比较,所以两个从集合的角度来看,此方法认为相等的键是相等的。一个集合的行为是明确定义的,即使它的顺序与equals不一致;它只是不遵守 Set 接口的一般约定。

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

于 2010-09-07T03:29:19.527 回答
1

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

于 2010-09-07T07:52:05.683 回答
1

您可以包装它们:

class BeanWrapper {

 ...

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

}

并把它们像那样放在集合中。

于 2010-11-28T14:07:52.427 回答