java中的Comparable和Comparator

这两个都是经典接口,

1、java.lang.Comparable接口:自然排序接口

      int compareTo(Object o)抽象方法

2、java.util.Comparator接口:定制排序接口

       int compare(Object o1, Object o2)

Comparable和Comparator都是用来比较对象顺序的接口,使用接口里的compareTo()方法。

首先是我们的Comparable接口。

抽象方法:
    int compareTo(Object o)
    
    返回值说明:
    比较此对象(this)与指定对象(形参o)的顺序。
    如果该对象this小于(<)指定对象(形参o),就返回负整数
    如果该对象this大于(>)指定对象(形参o),就返回正整数
    如果该对象this等于(=)指定对象(形参o),就返回0

使用方法是: 在定义的类后面实现Comparable接口。

并且重写compareto方法

 实现这个接口之后就可以直接使用CompareTo()去比较对象:

package com.atguigu.classics;

public class Tools {
//    public void compareTwoObject(类型1 s1, 类型2 s2){
//这个类型可以接收任意对象类型,想到用Object
    public static void compareTwoObject(Object s1, Object s2){
        if(((Comparable)s1).compareTo(s2)>0){
            System.out.println("s1 > s2");
        }else if(((Comparable)s1).compareTo(s2)<0){
            System.out.println("s1 < s2");
        }else{
            System.out.println("s1 = s2");
        }
    }
    public static void sort(Object[] arr){
        for(int i=0; i<arr.length-1; i++){
            for(int j=0; j<arr.length-1-i; j++){
               if(((Comparable)arr[j]).compareTo(arr[j+1]) < 0){
                        // Student temp = arr[j];
                        Object temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }

        }
    }

//    public void printArr(类型[] arr){
    //这个类型可以接收任意对象类型,想到用Object
    public static void printArr(Object[] arr){
        for(int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

 

然后在我们的测试类中就可以直接调用我们的方法:

package com.atguigu.classics;

public class TestStudent2 {
    public static void main(String[] args) {
        /*
        需求:
        (1)声明两个学生对象
        (2)对两个学生做大小比较
        例如:按照id比较大小
                */
        Student s1 = new Student(1,"张三",89,23);
        Student s2 = new Student(2,"李四",90,24);

        Tools.compareTwoObject(s1,s2);

         /*
        (3)学生对象更多了,5个,把它们放到数组中
         */
        Student[] arr = new Student[5];
        arr[0] = s1;
        arr[1] = s2;
        arr[2] = new Student(3,"王五",74,25);
        arr[3] = new Student(4,"赵四",99,20);
        arr[4] = new Student(5,"刘能",76,23);

         /*
        (4)排序,按照编号从大到小排序
         */
        Tools.sort(arr);

         /*
        (5)输出
         */
         Tools.printArr(arr);
    }
}

经典接口:
1、java.lang.Comparable接口:自然排序接口
        int compareTo(Object o)抽象方法
    凡是在Java中两个对象要比较大小,
    那么对象的类型就实现Comparable接口。

  Java通过设计这个接口,把所有两个对象比较大小的问题规范化了。

2、java.util.Comparator接口:定制排序接口
    int compare(Object o1, Object o2)

 

对象还有其他的比较要求的话,一般都是单独在写一个类,实现java.util.Comparator接口:定制排序接口。
在int compare(Object o1, Object o2)方法中编写对应比较规则即可。

通常不会在Student学生类中直接实现java.util.Comparator接口。
比喻:java.lang.Comparable接口是正室放家里是OK的,
     java.util.Comparator接口是彩旗,一般独立在外面。

public class StudentScoreComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        //按照学生的成绩从高到低排序
        //(1)先把o1,o2的类型处理一下,向下转型
        Student s1 = (Student) o1;
        Student s2 = (Student) o2;

        return s2.getScore() - s1.getScore();
    }
}

public class StudentAgeComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        //按照学生的年龄从小到大排序
        //(1)先把o1,o2的类型处理一下,向下转型
        Student s1 = (Student) o1;
        Student s2 = (Student) o2;

        return s1.getAge() - s2.getAge();
    }
}

public static void sort(Object[] arr, Comparator c){
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                /*
                调用Comparator接口的实现类的
                 public int compare(Object o1, Object o2) 方法
                 比较两个元素的大小。
                 c.compare(arr[j], arr[j+1]) 返回结果有3种:
                 正:arr[j] > arr[j+1]
                 负:arr[j] < arr[j+1]
                 0:arr[j] = arr[j+1]
                 */
               if(c.compare(arr[j], arr[j+1]) > 0){
                    // Student temp = arr[j];
                    Object temp = arr[j];//temp的类型跟着arr数组的类型变即可
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }

 之后再来比较对象的话,就是用Comparable接口是很方便的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值