开发者社区> miaoikxm> 正文

说说Comparator比较器那些用法

简介: 关于java的排序,在java8之后有了函数式接口之后,就产生了很多种Comparator比较器的写法。细数一下那些常用的比较器。
+关注继续查看

一、数据准备

1. Student对象

@Data是lombok

import lombok.Data;

@Data
public class Student {

    /** 姓名 */
    private String name;

    /** 年龄 */
    private Integer age;

    /** 成绩 */
    private Double score;

    /** 是否优秀学生 */
    private Boolean merit;
}

2. 随机生成学生数据

2.1 生成年龄(16~19岁)
private static int getRandomAge() {
    Random random = new Random();
    return random.nextInt(3) + 16;
}
2.2 生成成绩(0~100分)两位小数
private static double getRandomScore() {
    Random random = new Random();
    double a = random.nextDouble() * 100;
    DecimalFormat df = new DecimalFormat("0.00");
    String str = df.format(a);
    return Double.parseDouble(str);
}
2.3 生成优秀学生
private static boolean getRandomMerit() {
    Random random = new Random();
    return random.nextBoolean();
}
2.4 生成50名学生的数据
private static List<Student> getStudentList() {
    List<Student> list = new ArrayList<>();
    String name = "张";
    for (int i = 1; i <= 5; i++) {
        Student student = new Student();
        // 姓名拼接
        student.setName(name + i);
        student.setAge(getRandomAge());
        // 设置缺考成绩
        if (i == 2 || i == 3) {
            student.setScore(null);
        } else {
            student.setScore(getRandomScore());
        }
        student.setMerit(getRandomMerit());

        list.add(student);
    }

    return list;
}

二、数据排序

1. 简单用法

假设没有缺考的学生,即学生都有成绩,都是随机生成的成绩

不走if(i == 2 || i == 3)的判断

1.1 排序年龄
List<Student> studentList = getStudentList();
// 进行年龄排序-正序
studentList.sort(Comparator.comparingInt(Student::getAge));

// 排序-倒序
studentList.sort(Comparator.comparingInt(Student::getAge).reversed());
1.2 排序成绩
List<Student> studentList = getStudentList();
// 进行成绩排序-正序
studentList.sort(Comparator.comparingDouble(Student::getScore));

// 排序-倒序
studentList.sort(Comparator.comparingDouble(Student::getScore).reversed());
1.3 以此类推
# 排序优秀学生,使用了Boolean中的compare,而非比较器
studentList.sort((o1, o2) -> Boolean.compare(o1.getMerit(), o2.getMerit()));

# 排序学生名称-倒序,使用了通用的比较Comparator.comparing
studentList.sort(Comparator.comparing(Student::getName).reversed());

2. 组合用法

2.1 按年龄正序排序,年龄相等的,按成绩倒序排
studentList.sort(Comparator.comparingInt(Student::getAge).thenComparing(Comparator.comparingDouble(Student::getScore).reversed()));

# 注意,下面这种跟上面是不同的结果,注意
studentList.sort(Comparator.comparingInt(Student::getAge).thenComparingDouble(Student::getScore).reversed());
2.2 将没有成绩的排到最后或者最前
// 排到最后
studentList.sort(Comparator.comparing(Student::getScore, Comparator.nullsLast(Double::compareTo)));

// 排到最前
studentList.sort(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo)));
2.3 将空对象排到最后或者最前

所谓空对象,即student对象为null

studentList.add(null);

// 排到最后
studentList.sort(Comparator.nullsLast(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo))));

// 排到最前
studentList.sort(Comparator.nullsFirst(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo))));

3. Comparator比较器分类

image.png

3.1 reversed()

翻转比较结果,正序变倒序

3.2 thenComparing开头的

进行二次比较使用,即多个比较条件的

3.3 nullsFirst和nullsLast

null值的对象或者null值的属性放在最前或者最后

注意区分null对象和null值属性的不同用法

3.4 comparing开头

正常使用的比较器

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
21041 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
30425 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
14190 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
23155 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21361 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
17510 0
+关注
26
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载