Java Comparator 与 Comparable 接口

时间:2022-09-02 02:51:05

Java中这两个常用于排序的接口我总是过一段时间就忘了,这次干脆写下来它们,并附上测试的一段例子。

两者区别

  1. 所属包不同:Comparable在java.lang中,而Comparator在java.util中。
  2. 用于比较的方法定义不同:Comparable<T>中为public int compareTo(T object),而Comparator<T>中为public int compare(T object1, T object2)
  3. 使用的方法不同:使用Comparable时,往往使要比较的对象的类实现该接口,使得该类自身具有可比较的能力,再调用排序方法进行排序;而使用Comparator时,往往是将实现了Comparator的比较器实例与要进行排序的集合、数组等一起传入排序方法,排序对象的类本身与比较器并没有太直接的关系(当然,比较器的类型参数应该为要比较的对象的类)。

比较方法返回值

//compareTo:
obj1.compareTo(obj2);
/* 
 * 若返回正数,obj1 > obj2
 * 若返回零,obj1 = obj2
 * 若返回负数,obj1 < obj2
 * 可以理解为返回值与 obj1 - obj2 的正负性相同
 * /

 //compare(T obj1, T obj2):
 /* 
 * 若返回正数,obj1 > obj2
 * 若返回零,obj1 = obj2
 * 若返回负数,obj1 < obj2
 * 可以理解为返回值与 obj1 - obj2 的正负性相同
 * /

示例代码

package com.hupeiwei;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        //用于通过Comparable接口排序的List对象(当然并不只是List可以)
        List<Student> sortByNumber = new ArrayList<>();
        //用于通过Comparator实例进行排序的数组(当然并不只是数组可以)
        Student[] sortByName = new Student[]{new Student(1,"b"), new Student(2,"a")};
        //排序,传入了比较器
        Arrays.sort(sortByName,new MyComparator());
        System.out.println("Sort by name :");
        for( Student stu : sortByName) {
            System.out.println(stu);
        }
        /* output: * Sort by name : * Name : a Number : 2 * Name : b Number : 1 */
        //将刚才按照名字排好序的数组传入List对象
        sortByNumber.addAll(Arrays.asList(sortByName));
        //将刚才排序结果再次按照学号排序
        Collections.sort(sortByNumber);
        System.out.println("Sort by number :");
        for( Student stu : sortByNumber) {
            System.out.println(stu);
        }
        /* output: * Sort by number : * Name : b Number : 1 * Name : a Number : 2 */
    }/*main*/
}/*Main*/

class Student implements Comparable<Student> {
    private int number;
    private String name;
    Student(int number, String name) {
        this.number = number;
        this.name = name;
    }
    Student() {
        this(-1,"");
    }
    int getNumber() {
        return number;
    }
    String getName() {
        return name;
    }
    public String toString() {
        return "Name : " + getName() + " Number : " + getNumber();
    }
    //通过学号排序,无效学生放最前面
    public int compareTo(Student stu) {
        return number - stu.getNumber();
    }
}

//该比较器通过name字典序排序,通过String中重写的compareTo方法
class MyComparator implements Comparator<Student> {
    public int compare(Student stu1, Student stu2) {
        return stu1.getName().compareTo(stu2.getName());
    }
}