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中的排序函数(数组,集合,自定义类) 在文章末尾代码附录查看哦