29.Comparable 和 Comparator比较器

发布时间:2023-06-13 11:00

一、Comparator比较器

另个对象之间比较大小,Java中提供了两种比较实现方式,

  • java.lang.Comparable接口实现,要求在被比较的对象类中实现这个接口,实现public int compareTo(对象类型 对象)这个抽象方法。

  • java.util.Comparator接口,在做排序的时候去定制实现排序规则,实现public int compare(对象类型 o1, 对象类型 o2)这个抽象方法。

    • 两个对象比较的结果有三种:大于,等于,小于。如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照,降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)

ArrayList list = new ArrayList<>();
list.add(\"abcd\");
list.add(\"bcde\");
list.add(\"cdef\");
list.add(\"defg\");
list.add(\"efgh\");

Collections.sort(list, (a, b) -> b.charAt(0) - a.charAt(0));
/**等价于
 Collections.sort(list, new Comparator() {
    @Override
    public int compare(String o1, String o2) {
        return o2.charAt(0) - o2.charAt(1);
    }
});*/

System.out.println(list);

二、Comparable 和 Comparator两个接口的区别

1. 实现Comparable接口: 类的自然排序:

    1. 强行对实现它的每个类的对象进行整体排序(在类中实现Comparable接口,重写compareTo方法)
    1. compareTo方法为自然比较方法,在类中只能实现一次,不能经常修改类的代码实现自己想要的排序
    1. 适合固定的比较方式。
    1. 实现此接口的对象列表(和数组)可以通过Collections.sortArrays.sort不好用!,(只有一个参数)进行自动排序要想使用这两个方法,必须得实现Comparable接口,否则报错
    1. 对象可以用作映射中的键或者有序集合中的元素,不需要指定比较器,直接使用!
import java.util.ArrayList;
import java.util.Collections;

public class Student02 implements Comparable{
    private String name;
    private int age;

    public Student02(String name, int age) { this.name = name;this.age = age; }
    public Student02() { }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    @Override
    public int compareTo(Student02 o) {
        // 按照年龄升序排列,如果年龄一样就按照姓名字典序升序排序
        int result = this.getAge() - o.getAge();

        if(result == 0) {
            result = this.name.compareTo(o.getName());
        }

        return result;
    }

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

    public static void main(String[] args) {
        ArrayList students = new ArrayList<>();
        
        students.add(new Student02(\"a\", 20));
        students.add(new Student02(\"c\", 18));
        students.add(new Student02(\"a\", 18));
        students.add(new Student02(\"a\", 16));
        
         Collections.sort(students);
        for (Student02 student : students) {
            System.out.println(student);
        }
    }

}

2. Comparator接口:

    1. 强行对某个对象进行整体排序;
    1. 可以将Comparator的实现传递给sort方法(Collections.sortArrays.sort不好用 两个参数),从而实现在排列顺序上精确控制
    1. 使用Comparator来控制某些数据结构(有序set或者有序映射),后者为哪些没有自然顺序的对象collection提供排序。
import java.util.ArrayList;
import java.util.Collections;

public class Student03{
    private String name;
    private int age;

    public Student03(String name, int age) { this.name = name;this.age = age; }
    public Student03() { }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

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

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList<>();

        arrayList.add(new Student03(\"a\", 20));
        arrayList.add(new Student03(\"c\", 18));
        arrayList.add(new Student03(\"a\", 18));
        arrayList.add(new Student03(\"a\", 16));

        /**
        Collections.sort(arrayList, new Comparator() {
            @Override
            public int compare(Student03 o1, Student03 o2) {
                // 按照年龄升序排列,如果年龄一样就按照姓名字典序升序排序
                int result = o1.getAge() - o2.getAge();

                if(result == 0) {
                    result = o1.name.compareTo(o2.getName());
                }

                return result;
            }
        });*/
        // lamda
        Collections.sort(arrayList, (o1, o2) -> {
            int result = o1.getAge() - o2.getAge();
            
            if(result == 0) { 
                result = o1.name.compareTo(o2.getName()); 
            }
            
            return result;
        });

        for (Student03 student : arrayList) {
            System.out.println(student);
        }
    }
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号