当前位置: 首页 > 面试题库 >

与集合相等且可比

夏意蕴
2023-03-14
问题内容

我在这里张贴了一些代码,可以正确解决发布者遇到的问题。OP希望删除重复项,并将某些特殊项放在列表的顶部。我TreeSet在一个特殊的Comparable类中使用,包装了Locale他们正在使用的类,以实现他们想要的。

然后我开始思考......像你一样......我是通过返回消除重复0compareTo方法,而不是通过返回trueequals实现作为一个需要做的正确指示在重复Set(自定义一个的Set)。

我不反对使用此技术,但我是否使用了可能被视为 未记录的功能 ?我是否可以安全地假设继续进行此类操作会继续有效?


问题答案:

似乎这在(粗体的)JavaDoc中有TreeSet很好的记录:

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

这是唯一实现Comparable但与不一致的(?)JDK类的示例equals()

Set<BigDecimal> decimals = new HashSet<BigDecimal>();
decimals.add(new BigDecimal("42"));
decimals.add(new BigDecimal("42.0"));
decimals.add(new BigDecimal("42.00"));
System.out.println(decimals);

decimals在最后有三个值,因为4242.0并且42.00是不相等的,只要equals()关注。但是,如果将其替换HashSetTreeSet,则结果集仅包含一项(42-刚好是第一个添加的项),因为使用进行比较时,它们都被认为是相等的BigDecimal.compareTo()

这表明在使用与不一致的类型时TreeSet,这以“ 损坏 ” 的方式出现equals()。它仍然可以正常工作,并且所有操作都定义明确-
只是不遵守Set类的约定-如果两个类不是equal(),则它们不会被视为重复。

  • 比较等于等于是什么意思?如果我的课堂不遵循这一原则,可能会发生什么?


 类似资料:
  • 我在这里发布了一些代码,正确地解决了海报上的一个问题。OP希望删除重复项,并将某些特殊项置于列表的顶部。我使用了一个和一个特殊的类,该类包装了他们正在使用的,以实现他们想要的。 然后我开始想。。。正如你所做的。。。我是通过从方法返回来消除重复,而不是通过从实现返回来消除重复,这是正确指示中的重复(根据的定义)所需要的。 我不反对使用这种技术,但我是否使用了可能被视为未记录的功能?我是否可以放心地认

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 如何比较两个javascript集?我尝试使用和但都返回false。 这两个集合是等价的,因为根据定义,集合没有顺序(至少通常没有)。我看了MDN上的集合的留档,没有发现任何有用的东西。有人知道怎么做吗?

  • Map和Set都叫做集合,但是他们也有所不同。Set常被用来检查对象中是否存在某个键名,Map集合常被用来获取已存的信息。 Set Set是有序列表,含有相互独立的非重复值。 创建Set 既然我们现在不知道Set长什么样,有什么价值,那么何不创建一个Set集合看看呢? 创建一个Set集合,你可以这样做: let set = new Set(); console.log(set);

  • 我正在尝试为firestore中的社交媒体应用程序组织数据。为帖子创建一个新集合或将其放入用户的子集合更好吗? 深度应该是一样的,但是一种方式比另一种方式有什么优势吗? 创建新集合: 职位(集合) 用户(集合) 用户中的子集合: 用户(集合)

  • 然而,域的其余部分是具有挑战性的,出于许多原因,我不想直接将其映射到DB表。 我尝试引入由Hibernate管理的中间bean,并从这些bean映射到我的域,当所有的关系都是从挑战到容易的部分时,这很好地工作。当Hibernate管理的“Easy”类引用映射在自定义Java代码中的“挑战性”类,而不是直接Hibernate管理时,这种方法就失败了。 这时我意识到,我找不到自定义Hibernate和