Java Comparator 与 Comparable 接口

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());
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值