Java 比较器 -- 对象比较

2023-11-20

基本数据类型比较大小时,我们可以用比较运算符。当两个对象比较大小时,我们就可以用比较器了。实现的方式有两种,如下:

 

方式一:自然排序,实现接口Comparable

创建一个自定义类Students,实现接口Comparable,并重写compareTo方法,在方法体中规定排序规则。

class Students implements Comparable{
    private String name;
    private int age;

    public Students() {
    }

    public Students(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 "Students{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof Students){
            Students obj = (Students) o;

            /**
             * 当前对象属性大于参数的对象属性,返回值为正数时是从小到大排序
             * 当前对象属性小于参数的对象属性,返回值为正数时是从大到小排序
             */
            if(this.getAge() > obj.getAge()){
                return 1;
            }else if (this.getAge() < obj.getAge()){
                return -1;
            }else{
                return this.getName().compareTo(obj.getName());
            }
        }
        throw new RuntimeException("参数类型错误");
    }
}

public class CompareTest{
    public static void main(String[] args) {
        Students[] students = new Students[]{
                new Students("李雷", 26),
                new Students("黎明", 24),
                new Students("王伟", 29),
                new Students("艾米", 26),
        };

        Arrays.sort(students);

        System.out.println(Arrays.toString(students));
        // [Students{name='黎明', age=24}, Students{name='李雷', age=26}, Students{name='艾米', age=26}, Students{name='王伟', age=29}]
    }
}

方式二:定制排序,不需要实现接口Comparable

class Students{
    private String name;
    private int age;

    public Students() {
    }

    public Students(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 "Students{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class CompareTest{
    public static void main(String[] args) {
        Students[] students = new Students[]{
                new Students("李雷", 26),
                new Students("黎明", 24),
                new Students("王伟", 29),
                new Students("艾米", 26),
        };

        Arrays.sort(students, new Comparator<Students>() {
            @Override
            public int compare(Students o1, Students o2) {
                /**
                 * 当前对象属性大于参数的对象属性,返回值为正数时是从小到大排序
                 * 当前对象属性小于参数的对象属性,返回值为正数时是从大到小排序
                 */
                if(o1.getAge() > o2.getAge()){
                    return 1;
                }else if (o1.getAge() < o2.getAge()){
                    return -1;
                }else{
                    return o1.getName().compareTo(o2.getName());
                }
            }
        });
        
        System.out.println(Arrays.toString(students)); // [Students{name='黎明', age=24}, Students{name='李雷', age=26}, Students{name='艾米', age=26}, Students{name='王伟', age=29}]
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 比较器 -- 对象比较 的相关文章

  • 如何从JSP中获取java类的对象

    我有一个结果jsp页面 它打印java类的字符串变量 有人能给我任何想法吗 我使用简单的 httpServlet 作为操作类 Class A String name public void setName this name callMet
  • 如何禁用 Spring 日志记录 DEBUG 消息?

    我正在开发一个简单的桌面应用程序 不是网络应用程序 这是我的log4j properties log4j rootCategory INFO stdout log4j appender stdout org apache log4j Con
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它
  • Import 语句顺序有什么影响吗?

    这个疑问由来已久 当我使用 eclipse 编写类时 导入语句会自动填充 import语句的顺序有影响吗 1 关于编程执行速度 2 任何标准编码实践都是相同的 import语句对执行速度没有影响at all 它们仅在编译时重要 如果您完全限
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • java:查找数组中整数的频率

    我需要开发一个java要求用户输入一些内容的程序integers并找出最大和最小的数 以及这些数的平均值 然后 划分数组的集合分成若干子区间用户指定的 然后它生成一个边界点 每个边界点的长度为子区间宽度 问题是我需要创建一个频率 例如 间隔
  • Java:是否有工具可以使代码(在第 3 方 JAR 中)向前兼容(1.4 - 1.6)

    我有一个使用 Java 1 4 编译的第 3 方 JAR 文件 有没有一个工具可以使jar文件兼容Java 1 6 类似于 retrotranslator 但它的反面是什么 我尝试反编译类文件并在 1 6 中重新编译它们 但失败了 问题是这
  • Java 8 Arraylist 巨大容量(int) 实现

    我正在阅读文档了解如何ArrayListJava 中的 s 已增长 我不明白为什么hugeCapacity int minCapacity http grepcode com file repository grepcode com jav
  • 如何使用 unboundid-ldap-sdp 导入 ldif 文件?

    我从 LDAP 服务器导出了以下 ldif 文件 现在尝试导入它 以便可以复制从中导出它的目录 dn cn MYCOMPANY Users dc mycompany dc com changetype add objectClass pos
  • 在节点上生成 AES 密钥

    我正在处理一个使用自定义协议来加密通信的遗留应用程序 随机 AES 密钥在旧版 Java 应用程序中生成 如下所示 keygen KeyGenerator getInstance AES keygen init 128 keygen gen
  • 无法加载(查找)j2v8_android_x86 库

    我有一个使用的 gradle 项目j2v8 android 2 2 1 http mvnrepository com artifact com eclipsesource j2v8 j2v8 android 2 2 1库 为 V8 JS 引
  • 从MySQL php中的特定列获取最大ID和最小ID

    我是新来的php现在尝试从中检索数据MySQL到安卓 这是我的工作细节 table In 检索总小时数函数 我想检索最短 ID 时间 and 最大 ID 超时 from MySQL到安卓通过php最后使用下面的代码来获取总小时数 假设 ID
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • equals 和 hashcode 的不同字段

    我同意这篇文章的声明在Java中重写equals和hashCode时应该考虑哪些问题 https stackoverflow com questions 27581 overriding equals and hashcode in jav
  • 使用 Android 将文本文件上传到 Google Drive

    编辑 我已将文本设置为字符串 如下所示 字符串文本 你好 我想将其转换为纯文本文件 然后上传到 Google 云端硬盘文件夹 我已经尝试过下面的代码 但它不完整 所以我无法说出出现了什么错误 我正在使用 Google Drive 快速启动
  • Calendar.getActualMaximum(Calendar.WEEK_OF_YEAR) 怪异

    要么我不明白这个方法getActualMaximum int 或字段 WEEK OF YEAR 或者涉及 Sun bug 或全部三个 有人可以向我解释为什么吗 至少在德国语言环境中 以下代码 Locale setDefault Locale
  • 对需要强制转换的 Java 泛型感到困惑

    我对以下代码感到困惑 import java util ArrayList import java util LinkedList import java util List public class GenericsTest
  • Runtime.getRuntime().exec(),执行Java类

    我正在从我的应用程序内部执行 Java 类 proc Runtime getRuntime exec java Test 我怎样才能识别是否Test执行成功与否 即没有例外 重定向输出 错误 proc Runtime getRuntime
  • 当基类和派生类都具有同名变量时会发生什么

    考虑int a这些类中的变量 class Foo public int a 3 public void addFive a 5 System out print f class Bar extends Foo public int a 8
  • Java 中的 ConcurrentHashMap 和 Hashtable [重复]

    这个问题在这里已经有答案了 Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别 哪个对于线程应用程序更有效 ConcurrentHashMap 和 Hashtable 锁定机制 Hashtable属于Co

随机推荐

  • 人工智能-10种机器学习常见算法

    机器学习是目前行业的一个创新且重要的领域 今天 给大家介绍机器学习中的10种常见的算法 希望可以帮助大家适应机器学习的世界 1 线性回归 线性回归 Linear Regression 是目前机器学习算法中最流行的一种 线性回归算法就是要找一
  • 因果推断:因果表征学习的CV落地

    作者 Ostrich 单位 阿里巴巴算法工程师 研究方向 自然语言处理 搜索算法 本文主要梳理因果推断与机器学习相结合的一些比较新的工作思路 也是尝试回答自己在学习因果推断基础知识时的一些疑问 突然 被广泛谈及的因果可以以什么样的方式落地
  • 【BS】compilation debug=true targetFramework=4.0 无法识别的属性“targetFramework”

    一 背景 今天在发布网站的时候遇到这个问题 compilation debug true targetFramework 4 0 无法识别的属性 targetFramework 系统是师哥新做的windows server 2008 图一
  • 【vue】前端下载文件自定义文件名称

    下载文件自定义文件名称 文件下载名称不想和后端提供的URL一样怎么办呢 1 首先给按钮去绑定一个事件 2 正常我们的下载处理方式 3 自定义下载的文件名字 文件下载名称不想和后端提供的URL一样怎么办呢 1 首先给按钮去绑定一个事件 按钮的
  • 微信小程序第六篇:元素吸顶效果实现

    系列文章传送门 微信小程序第一篇 自定义组件详解 微信小程序第二篇 七种主流通信方法详解 微信小程序第三篇 获取页面节点信息 微信小程序第四篇 生成图片并保存到手机相册 微信小程序第五篇 页面弹出效果及共享元素动画 话不多说 先看效果 这种
  • ElasticSearch ected map for property [fields] on field [subject_id] but got a class java.lang

    ElasticSearch的聚类时出现fielddata true Expected map for property fields on field subject id but got a class java lang String
  • 前端导出多级表头

    前端导出多级表头 今天在技术交流群里面看到有人问到了这一块 我之前看过一些关于这样的代码 我就直接给他上了代码 自己又重新练习里一遍 这是结合elementUI来写的一个表格 先看一下练习的是这样的效果 首先还是要安装依赖 npm inst
  • Howto Upgrade Debian

    Howto Upgrade Debian 4 Etch to Debian 5 0 Lenny HowTo Upgrade Debian 5 0 Lenny To Debian 6 0 Squeeze HowTo Upgrade Debia
  • Centos7虚拟机创建并设置静态IP(桥接模式)

    一 准备工作 1 Centos7镜像文件下载 下载地址 Centos7下载地址 2 VMware安装 下载地址 VMware下载地址 二 创建虚拟机 1 新建虚拟机 新建虚拟机 选择典型即可 选择刚才下载的ISO镜像 虚拟机命名 可以修改虚
  • Flask项目部署到Ubuntu上

    前期准备 将在本地开发好的Flask项目打包 发送到云主机上 可以使用xftp等传输工具放到远程主机上 安装python虚拟环境 为python3安装pip sudo apt install python3 pip 为python安装pip
  • PicoDet的学习笔记

    学习资源 Paddle官方教程 AI快车道PaddleDetection 课节4 闪电版目标检测算法PP PicoDet PicoDet增强版官方介绍 超强目标检测算法矩阵 PicoDet XS PicoDet论文 PP PicoDet A
  • eclipse调试的时候进入了class文件

    解决方法是右键工程 debug as gt debug configuration 找到Apach Tomcat 点击source 将default 文件夹删除 然后点击Add 添加本地的 java project 项目即可
  • 开发APP前期的准备工作到底有多重要??

    如果经历过一个app从零开发的同学 可能就会知道 app前期的打地基到底有多重要 我从开始工作到现在 目前都是从零开发app的 没有试过中途填别人的坑 但是我试过留着泪给自己填坑 还是那种自己都不知道自己为什么要这样写的坑 改了还会崩溃 这
  • IDEA2020mybatis错误:Error:(5, 28) java: 程序包org.apache.ibatis.io不存在

    出现该错误是因为maven与IIDEA新版本不兼容 勾选IDEA默认集成maven 即修改一maven home directory为Bundled Maven 3 并修改为IDEA2020默认给的路径 不要用自己的maven本地仓库的路径
  • 2015物联网产业群雄逐鹿 推进产业健康发展

    本文转载至 http www 50cnnet com show 34 84566 1 html 核心提示 自2010 年 国务院关于加快培育和发展战略性新兴产业的决定 首次将物联网产业列为国家发展战略后 国家及各省市又陆续出台了针对涉及物联
  • # flutter、rn、uni-app比较

    flutter rn uni app比较 更新 DCloud已推出强大的uts 虽然第一个版本还不适于开发ui 但会陆续升级 这将是最佳的跨平台解决方案 详见 前言 每当我们评估新技术时要问的第一个问题就是 它会给我们的业务和客户带来哪些价
  • 闯关游戏 xss-lab

    level 1 直接测试 我们看到参数是name 那就吧payload带进去 发现直接就注入了 没有任何的过滤 其实我们可以先构造一串敏感字符 用作测试 看看程序是如何过滤的 比如
  • 基于SSM的校园二手交易平台

    一 源码获取 链接点击直达 下载链接 二 系统架构 使用技术 Spring SpringMVC Mybatis 三 系统需求分析 在如今的大学校园中 伴随着学生的购买能力的提高和每年的升学和毕业 存在许多各种类型的二手商品 目前 二手商品交
  • 安全顶刊论文阅读总结1

    论文阅读总结 An Explainable AI Based Intrusion Detection System for DNS Over HTTPS DoH Attacks 论文介绍 本文2022年发表在IEEE Transaction
  • Java 比较器 -- 对象比较

    基本数据类型比较大小时 我们可以用比较运算符 当两个对象比较大小时 我们就可以用比较器了 实现的方式有两种 如下 方式一 自然排序 实现接口Comparable 创建一个自定义类Students 实现接口Comparable 并重写comp