【Java】比较器 Comparator Comparable

news2024/9/25 11:12:33

一、背景

我们在使用 Collections.sort() 对链表进行排序(或者使用 Arrays.sort() 对数组进行排序)时,常常需要根据不同情况自定义排序规则。比如:当我们存储学生对象时,我们需要按照学生年龄进行排序,这时我们就可以通过比较器 Comparator 或者 Comparable 对排序顺序进行控制。

本文将结合示例对 Comparator 和 Comparable 两种比较器的使用进行介绍 ——

二、Comparable

Comparable 是一个接口,其本质上是一个内比较器(在类内部)。需要定义排序/比较规则的类实现 Comparable 接口,并且重写 compareTo(Object o) 方法,从而自定义比较规则。

public interface Comparable<T>

Comparable 代码示例 :

下面的代码为 Student 类重写了 compareTo 方法,实现了 Student 对象按照 age 大小进行比较

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

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

    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 "{" + this.getName() + "," + this.getAge() + "}";
    }
    
    // 通过重写 compareTo 方法,实现比较器
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        return this.age - student.getAge();
    }

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        Collections.sort(list);
        System.out.println(list);
    }
}

可以观察到输出结果按照 age 升序进行了排序 ——

在这里插入图片描述

三、Comparator

Comparator 是一个外比较器,其使用场景为 ——
当一个类未实现 Comparable 方法,或者实现的 Comparable 方法的比较规则不是我们现在想用的(比如我们想按照降序的方式排序),我们就可以通过为 sort() 方法传入 Comparator 的形式,自定义排序规则。

其使用方式如下:

Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);

Comparator 重写 compare 方法,方法内部重写比较规则

Comparator 代码示例

下面代码通过传入 Comparator比较器 的方式,实现了对 list 按照学生年龄降序排序

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        // 实现对 list 按照学生年龄降序排序
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 降序排序
                return o2.getAge() - o1.getAge();
            }
        });
        System.out.println(list);
    }

可以观察到输出结果按照 age 进行了降序排序 ——

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树状数组(Binary Indexed Tree (B.I.T))

树状数组 树状数组 (Binary Indexed Tree(B.I.T), Fenwick Tree) 是一个查询和修改复杂度都为 log(n) 的数据结构。 「前缀和查询」与「单点更新」 直接前驱&#xff1a;c[i] 的直接前驱为 c[i - lowbid(i)]&#xff0c;即 c[i] 左侧紧邻的子树的根。 直接后继&#xff1a;c[i…

财务精度:BigInteger 与 BigDecimal

财务精度&#xff1a;BigInteger 与 BigDecimal 每博一文案 师父说: 人这一辈子&#xff0c;真地好难。 有些人&#xff0c;好着好着&#xff0c;忽然就变陌生了&#xff0c;有些手&#xff0c;牵着牵着&#xff0c;瞬间就放开了&#xff0c;有些路&#xff0c;走着走着&#…

算法练习笔记——栈的常用方法以及算法练习

栈学习常用方法介绍力扣练习力扣 20. 有效的括号力扣 32. 最长有效括号常用方法介绍 Stack<Character> characters new Stack<>();//判断栈是否为空boolean empty characters.empty();//将a压入栈底&#xff0c;同时也返回aCharacter push characters.push(a);/…

MYSQL中的常见知识问题(一)

1、MYSQL中redolog、binlog 、undolog的区别与作用。redolog&#xff1a;即重做日志&#xff0c;用来实现事物的一个持久性&#xff0c;由radiobuff和radiolog两部分组成。其中 radiobuff是一个缓冲&#xff0c;存放在内存里面&#xff1b;radiolog是文件&#xff0c;存放在磁盘…

基于粒子群优化和引力搜索混合优化算法改进的前馈神经网络(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【3-神经网络八股】北京大学TensorFlow2.0

课程地址&#xff1a;【北京大学】Tensorflow2.0_哔哩哔哩_bilibiliPython3.7和TensorFlow2.1六讲&#xff1a;神经网络计算&#xff1a;神经网络的计算过程&#xff0c;搭建第一个神经网络模型神经网络优化&#xff1a;神经网络的优化方法&#xff0c;掌握学习率、激活函数、损…

走进 HTML

文章目录01 什么是HTML&#xff1f;02 HTML的基本结构03 网页基本标签04 图像标签05 链接标签06 块元素和行内元素07 列表07 表格08 视频和音频09 页面结构10 iframe内联框架11 表单语法&#x1f449; 表单元素格式&#x1f449; 表单的应用&#x1f449; 表单初级验证01 什么是…

【Mysql】 数据库用户管理

【Mysql】 数据库用户管理 DCL:英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1. 管理用户 想要对数据库用户进行操作&#xff0c;我们首先得进入 mysql 数据库 use mysql1.1 查询用户 select * from user;该条命…

每日一问-ChapGPT-20230122-关于春节习俗

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230116-关于春节习俗世界有哪些国家过春节中国各个地区过春节都有哪些习俗台湾的春节习俗有哪些新加坡过春节有哪些习俗初一到初七的传统习俗有哪些在热闹的节日里&#xff0c;自己无法融入氛围&#xff0c;是什么原因不喜…

【MySQL】第六部分 单行函数

【MySQL】第六部分 单行函数 文章目录【MySQL】第六部分 单行函数6. 单行函数6.1 常用的函数6.2 角度与弧度转换函数6.3 三角函数6.4 指数与对数6.5 进制转换6.6 字符串函数6.7 日期时间函数6.7.1 获取时间和日期6.7.2 日期与时间戳的转换6.7.3 获取月份、星期、星期数、天数等…

筑基二层 —— 图解函数递归、数组详解

目录 一.修炼必备 二.图解递归的执行过程 三.数组 3.1 一维数组 3.2 二维数组 3.3 数组的共同问题 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武…

I.MX6ULL裸机开发笔记7:汇编点亮LED灯

一、vscode调整 加入汇编插件ARM vscode权限受限&#xff08;因为Ubuntu中的文件有的是root权限创建的&#xff0c;vscode以普通用户打开的话没有操作权限&#xff09;chmod 修改文件或者文件夹权限 二、编程步骤 使能GPIO时钟设置引脚复用位GPIO设置引脚属性&#xff08;上下…

深入跨域问题(3) - 利用 JSONP 解决跨域

目录 1.简单例子&#xff1a; 2.基本实现 3.JSONP 与 CORS 的对比 什么是跨域&#xff0c;在这篇文章内部就不再讲述了&#xff0c;本文主要着重于实现 JSONP 。 script 标签&#xff1a; 根据同源策略的限制&#xff0c;在 端口&#xff0c;域名&#xff0c;协议 这三者 …

AX7A200教程(3): DDR3突发读写

上一个章节我们新建工程&#xff0c;然后进行基本的初始化操作&#xff0c;这个章节将在上个工程的基础上进行突发读写因ddr3读写部分控制信号比较多&#xff0c;所以ddr3读写控制模块比较复杂&#xff0c;本章节着重于一个256位数据的突发读写&#xff0c;ddr读写控制模块暂不…

【JavaWeb】前端开发三剑客之CSS(下)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:CSS的深度学习&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;JavaWeb代码存放仓库&#xff01; ⛵⛵作者…

(考研湖科大教书匠计算机网络)第二章物理层-第一、二节:物理层基本概念和传输媒体

文章目录一&#xff1a;物理层概念二&#xff1a;物理层传输媒体&#xff08;1&#xff09;导引型传输媒体A&#xff1a;同轴电缆B&#xff1a; 双绞线C&#xff1a;光纤①&#xff1a;光纤通信②&#xff1a;光纤D&#xff1a;电力线&#xff08;2&#xff09;非导引型传输媒体…

day22 多线程02

1.线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.State…

[ESP][驱动]ST7701S RGB屏幕驱动

ST7701SForESP ST7701S ESP系列驱动&#xff0c;基于ESP-IDF5.0&#xff0c;ESP32S3编写。 本库只负责SPI的配置&#xff0c;SPI设置屏幕两方面。由于RGB库和图形库的配置无法解耦&#xff0c;具体使用的RGB库&#xff0c;图形库需要自行配置添加。 SPI的指令&#xff0c;地…

操作系统真相还原_第5章第2节:内存分页机制

文章目录分段机制分页机制一级页表二级页表启用分页机制的过程启用分页机制(二级页表)详解程序include.incmbr.sloader.s写入硬盘启动bochs执行分段机制 分页机制 一级页表 二级页表 启用分页机制的过程 1、准备好页目录项及页表 2、将页表地址写入控制寄存器cr3 3、寄存器cr0…

【ArcGIS微课1000例】0059:三种底图影像调色技巧案例教程

三种调整影像底图效果的技术,让你的图纸清新脱俗,做出的图更美观! 文章目录 方法一:影像源类型调整方法二:符号拉伸类型设置方法三:影像分析模块设置方法一:影像源类型调整 这种方法是最基础、最简单的一种方法,可以调整的内容有限。当大家发现导入了影像,然后影像图…