作用

  对于引用类型,Java 无法区分谁大谁小。所以为了解决如何比较两个对象大小的问题,JDK 提供了两个接口 java.lang.Comparable 和 java.util.Comparator。

对于 Tree 来说

  实体类实现 Comparable 接口,对 Tree 而言,在添加元素时就已经自动排序了。实体类没有实现 Comparable 接口时,Tree 可在创建容器时将 Comparator 接口作为构造参数传入。

对于 List 来说

  List 不会自动排序还需要调用 Collections.sort(list)list,sort()。如果实体类实现了 Comparable 接口时,可以通过调用 Collections.sort(list) 对元素进行排序。如果实体类没有实现 Comparable 接口时,List 则需要在调用 sort 方法时将 Comparator 作为参数传入。

例子

  实体类没有实现 Comparable 接口时,可以将 Comparator 接口作为参数传入容器/方法中,从而对实体类进行排序

创建 List<User> 集合,想对集合中的对象按照年龄升序排序输出

class Solution {

    public static void main(String[] args) {
        List<User> list =new ArrayList<>();
        list.add(new User("zyx",18));
        list.add(new User("wmj",19));
        list.add(new User("xm",15));
        list.add(new User("ak",20));
    }
}

class User {
    String name;
    int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
Comparable 接口
class Solution {

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("zyx", 18));
        list.add(new User("wmj", 19));
        list.add(new User("xm", 15));
        list.add(new User("ak", 20));
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

class User implements Comparable<User> {
    String name;
    int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(User o) {
        return this.age - o.age;
    }
}
Comparator 接口
class Solution {

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User("zyx", 18));
        list.add(new User("wmj", 19));
        list.add(new User("xm", 15));
        list.add(new User("ak", 20));
        System.out.println(list);
        list.sort(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.age - o2.age;
            }
        });
        System.out.println(list);
    }
}

class User {
    String name;
    int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

标题:Comparable 和 Comparator 的用法
作者:Yi-Xing
地址:http://47.94.239.232/articles/2021/01/13/1610522289448.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!