Java SortedSet + Comparator,与equals()问题的一致性

Car*_*arl 1 java equals sortedset comparator

我想要一个按集合大小排序的SortedSet集合(在这种情况下设置自己,但不一定是一般).这似乎违反了使比较器与equals()一致的禁止 - 即两个集合可能不相等(通过具有不同的元素),但是与相同的值相比(因为它们具有相同数量的元素).

从理论上讲,我也可以通过比较器的方式对相同大小的组进行排序,但是使用排序不会利用这一点,并且没有真正有用的+直观的方法来比较相同大小的集合(至少,在我的特定情况下),所以这似乎是一种浪费.

这种不一致的情况是否有问题?

Chs*_*y76 8

SortedSet接口扩展核心Set,因此应符合Set规范中概述的合同.

实现这一目标的唯一可能方法是让元素的equal()方法行为与您的方法一致Comparator- 原因是核心Set基于相等而SortedSet运行,而基于比较运行.

例如,add()在核心Set接口中定义的方法指定如果已经存在一个元素,其equal()方法将以此新元素作为参数返回true,则无法向该元素添加元素.好吧,SortedSet不使用equal(),它使用compareTo().所以,如果你的compareTo()回报false你的元素将被添加,即使equals()要返回true,从而违反Set合同.

然而,这些都不是实际问题.SortedSet行为总是一致的,即使compare()vs equals()不是.