自然排序 Comparable

比较器排序 Comparator

实现自然排序 java.lang.Comparable 接口,重写compareTo() 方法

public class A implements Comparable<A>{
    /**
     * @param o
     * @return  如果结果是正数  就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
     * 对于结果 换个角度思考,this在前 就是升序,this在后 就是降序
     */
    @Override
    public int compareTo(T t) {
        return 0;
    }
}

注意:

当我们添加元素到容器的时候,如果使用的不允许重复的集合例如 TreeSet,在实现Comparable的时候 如果 我们写的条件过少,就会导致compareTo 返回值 = 0,我们的集合就会默认这个元素相同,导致无法添加到集合

案例演示

是先按照年龄升序,如果年龄相同,就按照姓名(中文转成拼音)进行升序

    @Override
    public int compareTo(Student o) {
        int num = this.age - o.age;
        /**
package com.zanglikun.domain;

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

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

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

    /**
     *
     * @param o
     * @return  如果结果是正数  就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
     * 对于结果 换个角度思考,this在前 就剩升序,this在后 就是降序
     */
    @Override
    public int compareTo(Student o) {
        int num = this.age - o.age;
        /**
         * String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
         */
        int num2 = num==0?this.name.compareTo(o.name):num;
        return num2;
    }
}

Test2

    @Test
    public void test002(){
        TreeSet<Student> list = new TreeSet<>();
        list.add(new Student("张大",30));
        list.add(new Student("张二",10));
        list.add(new Student("张三",40));
        list.add(new Student("赵四",30));
        list.add(new Student("赵四",80));
        list.forEach(x ->{
            System.out.println(x);
        });
    }

结果

解释:张 zhang ,赵 zhao 在ASCII 码中 o 大于 n 所以 当年龄都是30的时候 按照升序的话 赵四 排在 张大后面

比较器排序 java.util.Comparator

在创建集合的时候,我们在指定泛型的时候,可以额外追加 排序规则 即 比较器排序,代码如下:o1 > o2 是升序

    @Test
    public void test001() {
        TreeSet<Persion> list = new TreeSet<>(new Comparator<Persion>() {
            @Override
            public int compare(Persion o1, Persion o2) {
                int num = o1.getAge() - o2.getAge();
                /**
                 * String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
                 */
                int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
                return num2;
            }
        });
        list.add(new Persion("张大", 30));
        list.add(new Persion("张二", 10));
        list.add(new Persion("张三", 40));
        list.add(new Persion("赵四", 30));
        list.add(new Persion("赵四", 80));

        list.stream().forEach(x -> {
            System.out.println(x);
        });
    }

结果:

OK!