Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?

简介: Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?

Comparable 和 Comparator 的介绍


Comparable是   排序接口 ,只有一个方法 compareTo ,如果 想让一个类可以通过Arrays.sort() 方法进行排序,则可以让这个类继承Comparable接口 重写这个方法。

Comparator 是  比较接口 ,如果一个类本身不支持排序(即没有实现Comparable接口),但你又不能改动这个类,就可以写一个类(这个类又叫“比较器”) 实现Comparator接口, 然后重写Compare方法。我们想要排序的时候,就可以把这类的实例化对象传入到Arrays.sort() 这个方法里。  



什么时候使用??

Comparable :当我们自己写一个类的时候 ,可以用这个方法 实现自己想要的比较规则

Comparator  :当一个类 没有比较器 ,或者我们原本的比较器中的规则 不是我们想要的


Arrays.sort 重载的四类方法


sort( T[] a )  对指定T型数组按数字升序排序。

sort( T[] a , int formIndex , int toIndex )  对指定T型数组的指定范围按数字升序排序。

sort( T[] a , Comparator<? supre T> c )  根据指定比较器产生的顺序对指定对象数组进行排序。

sort( T[] a , int formIndex , int toIndex , Comparator<? supre T> c) 根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。


Comarable 与 sort 代码案例


class  Student implements Comparable<Student>{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}
public class TestComparable{
    public static void main(String[] args) {
        Student[] arr = new Student[]{new Student("aa",11),
                new Student("bb",22),new Student("cc",15)};
        Arrays.sort(arr);
        for (Student student : arr) {//打印出排序的结果
            System.out.println("name:" + student.name + "  age:" + student.age);
        }
        //控制台打印结果: 我们可以看到 按照我们重写的CompareTo的规则(年龄)进行排序了
        //name:aa  age:11
        //name:cc  age:15
        //name:bb  age:22
    }
}

Comparator 与 sort 代码案例

//我们写一个实现Comparator的类,然后重写compare方法
class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}
public class TestComparator {
    public static void main(String[] args) {
        Integer[] arr = {2, 3, 44, 11, 344, 11};
        MyComparator cmp = new MyComparator();
        Arrays.sort(arr, cmp);//arr是数组,cmp是传入这个类
        System.out.println(Arrays.toString(arr));
    }
    //控制台打印结果:
    //[344, 44, 11, 11, 3, 2]
}


而在真正写代码的时候 我们一般 通过匿名内部类的方法 去写一个比较器比如下面

public class TestComparator {
    public static void main(String[] args) {
        Integer[] arr = {2,3,44,11,344,11};
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(arr));
    }
    //控制台打印结果:
    //[344, 44, 11, 11, 3, 2]
}


相关文章
|
3月前
|
Java
Java中的比较器Comparable与Comparator
Java中的比较器Comparable与Comparator
|
4月前
|
Java
Comparable和Comparator两种比较器详解
Comparable和Comparator两种比较器详解
19 0
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
|
Java
Java的比较器Comparable和Comparator用法
Java的比较器Comparable和Comparator用法
151 0
Comparable与Comparator有什么区别?
Comparable与Comparator有什么区别?
177 0
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
121 0
Java对象的比较和排序(Comparator和Comparable)
|
存储 Java 索引
【Java集合类】之TreeSet集合与Comparable/Comparator排序
【Java集合类】之TreeSet集合与Comparable/Comparator排序
109 0
|
Java
Java - Map 自定义排序 Lambda 之 Comparator
Java - Map 自定义排序 Lambda 之 Comparator
613 0