美文网首页
考虑实现Comparable接口

考虑实现Comparable接口

作者: 没走过的二丁目 | 来源:发表于2018-04-18 15:14 被阅读0次

为什么要实现Comparable接口

对于普通的数值或者字符串,都可以进行一定的排序。但是,能不能直接给对象进行排序呢?答案当然是不能的了,实际上,之所以我们可以对数值和字符串进行排序,是因为系统内部已经为我们定义了数值和字符串的排序关系。而我们定义的对象,本身是不包含排序关系的,因此,我们无法直接对对象进行排序。

类实现了Comparable接口,就表明他的实例具有内在的排序关系

compareTo方法的通用约定于equals方法的相似

  • 实现者必须确保所有的x和y都满足sng(x.compareTo(y)) = =-sng(y.compareTo(x))
  • 实现着必须确保这个比较关系是可传递的 x.compareTo(y)>0,y.compareTo(z)>0 ,x.compareTo(z)>0
  • 实现着必须确保x.compareTo(y) ==0 暗示着所有的z都满足 x.compareTo(z) == y.compareTo(z)

强烈介意(x.compareTo(y)==0 ) == (x.equals(y)

考虑BigDecimal类,它的equals方法和compareTo方法不一致,如果你创建了一个HashSet实例,并且添加new BigDecimal(“1.0”)和newBigDecimal(“1.00”)这个集合就将包含两个元素,因为通过equals方法判断时候是不相等的,当你TreeSet来执行同样的过程,集合中将包含一个元素,因为他们的compareTo方法是相等的。

compareTo 方法的比较

compareTo方法中域的比较是顺序比较的,而不是等同性的比较,如果一类有多个关键域,那么你可以从最关键的域开始,依次比较

    @Override
    public int compareTo(Person o) {
        if (id > o.id)
            return 1;
        if (id < o.id)
            return -1;
        //id相等的情况下,对age进行排序
        if (age > o.age)
            return -1;
        if (age < o.age)
            return 1;
        //若id和age相等,则直接通过名字来进行排序。
        return name.compareTo(o.name);
    }

以上这个方法就是先按照id进行比较,id相等后比较age,最后再按照名字进行比较(该类实现了Comparable接口

相关文章

网友评论

      本文标题:考虑实现Comparable接口

      本文链接:https://www.haomeiwen.com/subject/fikekftx.html