傻傻的分不清 Comparator 和 Comparable 接口? 两分钟弄懂~

news2024/12/26 13:52:54

目录

一、Comparable 接口

二、Comparator 接口


一、Comparable 接口


Comparable 是一个排序接口(意味着该支持排序),可以看作内比较器,也就是说可以和自己比较,通常用来自己属性与自己属性进行比较,最后通过  Collections.sort 得出该类在这个 “排序规则” 下得出的顺序,依赖于 compareTo 方法进行比较,该方法只有一个参数,就是要比较的对象。

怎么使用呢?例如我们有一个 Student 类,需要按照年龄进行升序排序,那么就可以让该类实现 comparable 接口,重写 compareTo 方法,比较规则为按照年龄大小升序进行排序,如下代码:

Ps:这里升序还是降序,到底是用谁减谁?不用死记,每次用之前自己试一下,试多了自然清楚.

import java.util.*;

class Student implements Comparable<Student> {

    private String name;
    private int age;

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

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

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

public class Solution {
    public static void main(String[] args) {
        Student s1 = new Student("u1", 15);
        Student s2 = new Student("u2", 19);
        Student s3 = new Student("u3", 11);
        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        Collections.sort(list);
        System.out.println(list);
    }
}

执行结果如下:

 

二、Comparator 接口


comparator 相当于一个通用的比较工具类接口,也就是说不在像 Comparable 接口那样给某个类实现一个比较器,而是需要我们为这个接口定制一个比较类去实现比较规则,通过重写 compare 方法,方法的参数就是两个进行比较的对象(对象不用做任何改变,实现解耦)。

怎么使用呢?例如有一个 Student 类,需要按照年龄进行升序排序,那么我们就可以去定制一个比较类,重写比较规则,代码如下:

import java.util.*;


class Student {

    public String name;
    public int age;

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

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

public class Solution {
    public static void main(String[] args) {
        Student s1 = new Student("u1", 15);
        Student s2 = new Student("u2", 19);
        Student s3 = new Student("u3", 11);
        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.age - o2.age;
            }
        });
        System.out.println(list);
    }
}

执行结果如下:

 

 

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

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

相关文章

百年孤独 -- 有感

《创世记》之后&#xff0c;首部值得全人类阅读的文学巨著。 — 纽约时报 加西亚 马尔克斯以小说作品创建了一个自己的世界&#xff0c;一个浓缩的宇宙&#xff0c;其中喧嚣纷乱却又生动可信的现实&#xff0c;映射了一篇大陆及其人民的富足与贫困。 — 诺贝尔文学奖颁奖辞 马…

wordpress+apache搭建问题总结

访问首页出现服务器目录 需要到apache的httpd.conf 添加index.php默认值 更新失败。 此响应不是合法的JSON响应 大多出现于修改固定连接后 打开httpd.conf文件,把AllowOverride None修改为AllowOverride All,重启apache即可解决 AllowOverride Noneyi意味着忽略.htaccess文件…

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)

VS2022中创建CSDK库(dll动态库)并调用SDK库(dll动态库) 一、说明 通过前两篇的文章我们知道了封装一个Qt下的SDK库&#xff08;dll动态链接库&#xff09;和封装Pimpl模式。 Qt创建SDK库(dll动态库)并调用SDK库(dll动态库) SDK(动态链接库dll)的封装技巧 本篇介绍在C VS下…

深度解析动态分配内存管理

目录 ​编辑 一. 前言 二.正文 2.0 计算机中的内存 2.1 动态申请函数头文件 2.2 malloc函数 2.3 free函数 2.3 calloc函数 2.4 realloc函数 2.5 经典笔试题 1. 2. 2.6 柔性数组 三.结语 一. 前言 本小节跟大家分享动态内存管理的知识&#xff0c;希望能给大家带…

2020年全国10m分辨率地表覆盖数据集

1.数据概况 地球观测技术的进步使得土地覆盖制图的空间分辨率不断提高&#xff0c;但这也导致了高分辨率影像样本收集和更新变得更加耗时。本研究提出了一种基于样本噪声学习的跨分辨率土地覆盖制图框架&#xff0c;利用现有低分辨率产品生成大量高分辨率影像标签用于深度语义…

【Python从入门到进阶】17、文件的读写操作

接上篇《16、文件的打开和关闭》 上一篇我们学习了Python打开和关闭文件的操作。本篇我们主要学习Python文件对象包含哪些方法&#xff0c;并学习文件如何进行读、写、定位和删除。 一、文件对象的属性和方法 通过上一篇的学习我们知道&#xff0c;open函数会返回给我们一个文…

一个简单的盒模型嵌套---一个大盒子里面嵌套两个中盒子,右边中盒子嵌套六个小盒子

html代码&#xff1a; <div class"box1"><div class"box2"></div><div class"box3"><div class"box4"></div><div class"box5"></div><div class"box6">&…

apple pencil值不值得购买?ipad平替电容笔安利

自从Apple Pencil上市后&#xff0c;平替电容笔在国内的销量&#xff0c;也是随之而增加&#xff0c;虽然Apple Pencil的性能不错&#xff0c;但由于其的价格太高&#xff0c;所以不少普通用户都买不起。现在市面上有很多能够代替苹果原装笔的平替电容笔。在这里&#xff0c;我…

Debezium系列之:自定义表级别Topic的名称

Debezium系列之:自定义表级别Topic的名称 一、需求背景二、去掉部分topic名称的方法三、debezium具体实现方法四、完整配置一、需求背景 debezium表级别Topic命名规则为:topic.prefix参数的值.数据库名称.表的名称现在支持实时需求,命名名称需要修改为topic.prefix参数的值.…

SAP KANBAN 从入门到放弃系列之生产补货模式

目录 系统操作 看板牌-生产补货 系统配置&#xff1a; 补充策略配置 看板状态配置 创建物料主数据 创建供应区域 创建控制周期-经典看板 系统操作 看板牌-生产补货 需要必要的看板配置和主数据设置 第一步&#xff1a;事务代码:PK13N&#xff0c;需求端KANBAN.供应端…

【数据库】 | 初始数据库

&#x1f397;️ 博客新人&#xff0c;希望大家一起加油进步 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 1、什么是数据库2、数据库分类3、 一些重要概念4、 数据存储 1、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以…

访京东查询(自定义查询,组件形式,多页面使用,自定义查询条件)

1、效果图 2、使用了Ant Design of Vue里面的tag属性&#xff0c;也可以不用自己写样式。 3、代码模块 1、创建一个公共组件vue文件 <template><a-card size"small" :bordered"false" style"margin-bottom: 10px; padding:0px;">&l…

SVG格式文件可以用什么软件打开?

SVG是一种基于矢量的图像文件格式&#xff0c;通过基于网格上的点和线的数学公式存储图像&#xff0c;与 JPEG 等基于像素的位图文件不同。这种文件类型可以在不损失任何质量的情况下生成很小的文件&#xff0c;因而加载速度也相对更快&#xff0c;也使其成为LOGO和复杂在线图形…

SQL——多表连接查询

若一个查询同时涉及两个或两个以上的表&#xff0c; 则称之为连接查询&#xff08;在FROM子句中体现)。 参与连接的表可有多个&#xff0c;但连接操作在两个表之间进行&#xff0c;即两两连接。 连接查询包括&#xff1a; 内连接 等值连接&#xff1a;用“”比较被连接列的列值…

场景提效:多维表格重塑项目管理流程

此模板适用场景&#xff1a;多任务多团队之间的项目管理 预计实现效果&#xff1a;一张万能表格汇总所有信息&#xff0c;并可以按多视图进行或查看&#xff0c;根据待办项自动定期提醒成员同步进度。 效果对比 需求旧方式新方式统一汇总管理信息全篇文字罗列&#xff0c;呈…

【Linux】线程

1.理解地址空间和页表 1.地址空间是进程能够看到的资源窗口 2.页表决定进程真正拥有的资源情况 3.合理的对地址空间和页表进行资源划分就可以对一个进程的所有资源进行划分&#xff1a;过地址空间分为栈区、堆区…通过页表映射到不同的物理内存。 在32位平台下&#xff0c;…

Mysql学习(十一) -- 常见问题处理

1. MySQL数据库cpu飙升的话你会如何分析 重点是定位问题。 使用top观察mysqld的cpu利用率 切换到常用的数据库使用show full processlist;查看会话观察是哪些sql消耗了资源&#xff0c;其中重点观察state指标定位到具体sql pidstat 定位到线程在PERFORMANCE_SCHEMA.THREADS中…

Nevercenter CameraBag Pro照片滤镜软件 v2023.2.0

Nevercenter CameraBag Pro是一款照片滤镜工具&#xff0c;它可以让您轻松地添加各种效果和样式到您的照片中。该软件可以模拟不同类型的相机、胶片和滤镜&#xff0c;让您的照片呈现出具有艺术感的效果。 CameraBag Pro提供了多达200种不同的滤镜和效果&#xff0c;包括黑白、…

自然机器人最新发布:智能流程助手,与GPT深度融合

ChatGPT自2022年11月上线后就受到现象级地广泛关注&#xff0c;5天时间用户就已经突破百万&#xff0c;仅2个月时间月活用户就突破1亿&#xff0c;成为史上增速最快的消费级应用&#xff0c;远超TikTok、Facebook、Google等全球应用。它展现了类似人类的语言理解和对话交互能力…

java+Servlet家庭个人理财财务系统

目录 1 引言 1 1.1 选题背景 1 1.2 国内外研究现状 1 1.3 课题研究意义 1 1.4 设计目标 2 2 系统关键技术研究 3 2.1 JSP技术简介 3 2.2 Servlet技术简介 4 2.3 My Eclipse简介 7 2.4 系统运行平台 8 3 系统需求分析 9 3.1 总体需求 9 3.2…