首页 新闻 会员 周边

关于collection排序,如何理解下面两句话呢?

0
[已解决问题] 解决于 2018-11-20 12:58

对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。

注意如果要正确实现 Set 接口则 set 维护的顺序(无论是否提供了显式比较器)必须与 equals 一致。

doubleya的主页 doubleya | 菜鸟二级 | 园豆:204
提问于:2018-04-22 11:04
< >
分享
最佳答案
0

1、Collectons 类使用 sort方法时,有两个方法。

<T extends Comparable<? super T>>
void
sort(List<T> list)
          根据元素的自然顺序 对指定列表按升序进行排序。
static
<T> void
sort(List<T> list, Comparator<? super T> c)
          根据指定比较器产生的顺序对指定列表进行排序。

第一个方法中排序使用自然顺序,传入了继承Comparble 的list

2、再来看Comparable

  此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

  也就是Comparable  默认使用 CompareTo方法作排序(自然顺序)。

 3、对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。
 也就是说保证 e1.compareTo(e2) == 0和e1.equals(e2) 得到的结果相同。
4、它的作用在于
    如果我们向 set中插入a元素与b元素
    假如(!a.equals(b) && a.compareTo(b) == 0)
我们表面看a.equals(b)为fales ,ab不同可以全部插入
事实上a.compareTo(b) == 0 为true ,在set看来ab是相同的,无法全部插入,会造成第二个元素插入失败。

奖励园豆:5
千彧 | 菜鸟二级 |园豆:207 | 2018-04-22 12:34

谢谢回复,这是API的内容呀,能否举个具体的实例呢?

doubleya | 园豆:204 (菜鸟二级) | 2018-04-23 09:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册