java基础 之 compare比较器:compareTo comparable comparator

Comparable接口 & compareTo()方法

Comparable

  • Comparable是接口,Comparable 接口仅仅只包括一个函数

    package java.lang;
    import java.util.*;
     
    public interface Comparable {
        int compareTo(T o);
    }
    
  • 实现Comparable接口,需要重写comparaTo方法

  • Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

comparaTo

  • 是实例方法,只能对象调用。不能比较基本类型
  • 参数类型可以是: Byte, Double, Integer, Float, Long, Short, String类型
  • 重写comparaTo接口,必须要求该类实现了Comparable接口
  • 在自然排序中的使用

代码实现 及 比较规则

  • 1、当前对象this和形参对象obj必须是同一种类型;
  • 2、当前对象this大于形参对象obj,返回1,交换两个对象的位置
  • 3、当前对象this等于形参对象obj,返回0,位置不变
  • 4、当前对象this小于形参对象obj,返回-1,位置不变
  • 5、当比较属性是Integer或int时,可以使用“-”:this在前obj在后,为升(正)序;反之为倒序
    (如下图,s.age-this.age意思是姓名相同时,按年龄倒序排列)
    在这里插入图片描述

    说明:
    1、字符、字符串是按照Unicode来排序的
    2、Integer、Double、Float等数值类型的包装类是按照数值来比较的

排序

  • 1、类已经实现了Comparable接口并重写了compareTo()方法

  • 2、添加到List类,可以直接使用Collections.sort()方法排序

    List<Student> listStudent = new ArrayList<>();
    // 这里省略了添加对象到list集合的内容
    Collections.sort(listStudent);
    
  • 3、添加到数组,可以直接使用Arrays.sort()方法排序

    Student[] students = new Student[5];
    // 这里省略了添加对象到数组的内容
    Arrays.sort(students);
    

comparator

  • 比较器,一般用于瞬时排序,被类所继承并重写compara(T o1,T o2)方法。

使用场景

  • 自定义类没有实现Comparable接口,但是又不方便改代码是,可以使用comparator
  • 已经实现了Comparable接口且重写了comparaTo方法,但是规则需要修改时,可以使用comparator
  • 实现Comparator接口的方法,必须要增加static修饰符
  • 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数

代码实现

在这里插入图片描述
(换了个类名,对比上边的内容时,可以把phone认为成sno)

排序

  • 1、添加到数组,使用Arrays.sort()方法排序

    Person[] persons = new Person[5];
    // 这里省略了添加对象到数组的内容
    Arrays.sort(persons,Person.COMPARATOR);  // 排序
    
  • 2、添加到集合,可以使用两种方法来排序
    (无论哪种方法,都需要传入类的comparator方法)

List<Person> listPerson = new ArrayList<>();
Collections.sort(listPerson,Person.COMPARATOR);   // 方法一
listPerson.sort(Person.COMPARATOR);     // 方法二

归纳总结

  • java为包装类(String,Integer,Double,Float等)定义了compara()方法,可以直接拿来用

  • Comparable + compareTo:

    • 实现Comparable接口的类必须重写compareTo方法
    • 是内部比较器,说明该类是支持排序的类
    • 使用Collections和Arrays排序时,不需要额外传入参数
  • Comparator:

    • 一般使用匿名内部类来实现该接口
    • 是外部比较器
    • 可以使用Collections和Arrays排序,但是需多传入静态比较方法
    • 可以使用 数组.sort(静态比较) 的方法(独有的哦)

涉及本文的所有代码可以 戳这里→java中的排序函数(数组,集合,自定义类) 在文章末尾代码附录查看哦

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值