Comparable与Comparator有什么区别?

简介: Comparable与Comparator有什么区别?

一、Comparable接口


Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器

需求:请将两个对象之间的属性字段按照大小规则排序
如:  * 1.如何按照年龄大小排序呢?
     * 2.体重降序排列呢??
     * 3.按照年龄升序排列,年龄相同的体重升序排列???


代码:

public class Student implements Comparable<Student>{
    private int age;
    private String name;
    private int weight;
  ...
  /**
     * 实现Comparable接口 重写compareTo方法即可
     * return表示的是 0 相同  0  1【正序】 -1【倒叙】
     * 优点:灵活
     * 缺点:每次指定规则
     *
     * 1.如何按照年龄大小排序呢?
     * return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
     * 2.体重降序排列呢??
     * return -(this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1);
     * 3.按照年龄升序排列,年龄相同的体重升序排列???
     * if (this.age == o.age){
     *    return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
     * }else{
     *    return (this.age < o.age) ? -1 : 1;
     * }
     */
  @Override
    public int compareTo(Student o) {
        // return 0;
        //return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
        if (this.age == o.age){
            return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
        }else{
            return (this.age < o.age) ? -1 : 1;
        }
    }
}


测试方法:


public class Comparable01 {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(13,"张三",100));
        list.add(new Student(16,"李四",120));
        list.add(new Student(11,"王五",130));
        // Comparable: Collections.sort(list);  会报错 按照神魔来排序呢????
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

二、Comparator接口【比较器


若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数

public class Person {
    private int age;
    private String name;
    private int weight;
}

实现比较器的方法:

class PersonCompare implements Comparator<Person>{
    // 指定比较规则,和Comparable 的写法是一样的
    @Override
    public int compare(Person o1, Person o2) {
        // return 0;
        // 按照年龄升序排序
        return o1.getAge() - o2.getAge();
    }
}

测试方法:

public class Comparator01 {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person(13,"张三",100));
        list.add(new Person(16,"李四",120));
        list.add(new Person(11,"王五",130));
        // 创建一个比较的实现类,放入比较规则
        Comparator c = new PersonCompare();
        Collections.sort(list, c);
    }
}

三、总结


1.Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。


2.Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。


3.Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。


4.用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。


5.用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了


目录
相关文章
|
5月前
|
Java
Comparator与Comparable有什么区别
【8月更文挑战第16天】Comparator与Comparable有什么区别
106 5
|
8月前
|
Java
Comparable和Comparator两种比较器详解
Comparable和Comparator两种比较器详解
87 0
Comparable与Comparator对象比较
Comparable与Comparator对象比较
66 0
|
搜索推荐 算法 安全
浅谈Comparable和Comparator
首先我们考虑一个场景:有一个整形数组, 我们希望通过调用一个工具类的排序方法就能对该数组进行排序. 请看下面的代码:
Comparable 和 Comparator的理解
Comparable是一个排序接口 此接口给实现类提供了一个排序的方法,此接口有且只有一个方法
139 0
Comparable 和 Comparator的理解
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
120 0
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
119 0
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
165 0
Java对象的比较和排序(Comparator和Comparable)
|
Java
Comparable接口和Comparator接口
Comparable接口和Comparator接口
232 0
Comparable接口和Comparator接口

热门文章

最新文章