JavaSE学习——比较相关接口

很多类里面有compareTo方法,这个方法是源于comparable接口里。Arrays可以调用sort方法,前提是这个数组类型实现了comparable方法。

比如下面的代码是不对的,因为Student类并没有实现comparable接口,所以数组不知道明确的比较规则而报错:

复制代码
public class Main {
    public static void main(String[] args){
        Student[] stu = {new Student(), new Student()};
        Arrays.sort(stu);
    }
    static class Student{ }
}

现在为Student类里实现Comparable接口:

复制代码
static class Student implements Comparable<Student>{
    int age;

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

    @Override
    public int compareTo(Student o) {
        return age - o.age;
    }

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

有了比较的方法,就可以进行排序;

java 复制代码
    public static void main(String[] args){
        TreeSet set = new TreeSet<>();
        set.add(new Student(10));
        set.add(new Student(16));
        System.out.println(set);
    }
java 复制代码
public static void main(String[] args){
        Student[] arr = {new Student(6),new Student(9),new Student(8)};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

此外,如果在Student类并没有实现Comparable方法,也可以在调用Arrays.sort()的时候使用lambda表达式去添加。比如:

复制代码
public static void main(String[] args){
    Student[] arr = {new Student(6),new Student(9),new Student(8)};
    Arrays.sort(arr, (s1,s2)->s1.age-s2.age);   //比较方法
    System.out.println(Arrays.toString(arr));
}
static class Student{
    int age;

    public Student(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}

在TreeSet里面,也可以定义比较方法:

复制代码
TreeSet<Student> stu = new TreeSet<>((s1,s2)->s1.age - s2.age);
stu.add(new Student(6));
stu.add(new Student(9));
System.out.println(stu);

此外,可以单独写一行定义comparator,这样就直接传入:(reversed是在原来的基础上取反)

复制代码
Comparator<Student> comparator = (s1,s2)->s1.age - s2.age;
TreeSet<Student> stu = new TreeSet<>(comparator.reversed());

现在,我们除了需要比较年龄来排序,还要一个额外的姓名排序(即年龄一样,按照姓名排序),使用thenComparing(),下面是Student类:

复制代码
static class Student{
    int age;
    String name;

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

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

下面是主文件:

复制代码
Comparator<Student> comparator = (s1,s2)->s1.age - s2.age;
TreeSet<Student> stu = new TreeSet<>(comparator.thenComparing((s1,s2)->s1.name.compareTo(s2.name)));
stu.add(new Student(6,"hxl"));
stu.add(new Student(6,"lhw"));
stu.add(new Student(8,"520"));
System.out.println(stu);

此外,thenComparing也可以:

复制代码
Comparator<Student> comparator = (s1,s2)->s1.age - s2.age;
TreeSet<Student> stu = new TreeSet<>(comparator.thenComparing(
        s->s.name,
        (n1,n2)->n1.compareTo(n2))
);

thenComparing还可以更加精简,因为上面使用的也是字符串默认的比较方式:

复制代码
TreeSet<Student> stu = new TreeSet<>(comparator.thenComparing(
        s->s.name)
);

还有比较规则对于空值的处理:

复制代码
reeSet<Integer> set = new TreeSet<>(Comparator.nullsFirst(Comparator.naturalOrder()));

nullsFirst表示如果传入值为null,比较级优先。naturalOrder表示默认的比较(从小到大)

复制代码
set.add(5);
set.add(1);
set.add(2);
set.add(null);
System.out.println(set);

也可以这样写

复制代码
TreeSet<Student> stu = new TreeSet<>(Comparator.comparing(s->s.age));

总结:

Comparator是类外面手动定义的一个比较规则,Comparable是类内部自行定义的衣服比较规则。

相关推荐
mykj15514 小时前
英语单词APP解锁学习新方式,智能高效背单词
学习·英语单词app
知识分享小能手4 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
~kiss~5 小时前
Agent 的 未来吗?String: An Agentic OS Where Every App Is a Markdown File
学习
HugoStudio_SWAN6 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
UIU1148 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
zyf10441612 小时前
暑期实践日志 Day48:复盘大纲与知识点对照表,系统汇总整理成果
学习·计算机网络·剪辑·暑期实践·课题任务
m4Rk_14 小时前
【论文阅读】Agent 记忆机制(61):CFGM——用粗到细的记忆落地贯通经验采集、知识蒸馏与在线纠错
论文阅读·人工智能·学习·开源·github
边境悍匪14 小时前
蜗牛学苑 Java 智能体学习 Day33|AOP 面向切面编程、日志技术思维导图复盘
学习
我是你的开心果77814 小时前
ai全栈软件开发day21(第四阶段喽)
人工智能·学习
网络工程小王14 小时前
【LLM开发实验】FastAPI 学习笔记
数据库·笔记·学习·mysql·fastapi