Java基础之比较器

2023-11-15

一 、背景

Java中的对象,正常情况下,只能进行比较:== 或 !=。不能使用 > 或 < 的
但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。
如何实现?使用两个接口中的任何一个:Comparable(自然排序) 或 Comparator(定制排序)

二 、Comparable(自然排序)

1.像 String 或包装类等实现了Comparable接口,重写了 compareTo(obj) 方法,给出了比较两个对象大小的方式。
2.像 String 或包装类重写 compareTo() 方法以后,进行了从小到大的排列
3.重写 compareTo(obj) 的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写 compareTo(obj) 方法。在 compareTo(obj) 方法中指明如何排序
5.Comparable的典型实现:(默认都是从小到大排列的) String:按照字符串中字符的Uincode值进行比较 Character:按照字符的 Unicode值来进行比较 数值类型对应的包装类以及 BigInteger、BigDecimal:按照它们对应的数值大小进行比较 Boolean:true对应的包装类实例大于false对应的包装类实例 Date、Time等:后面的日期时间比前面的日期时间大

public class Goods implements  Comparable{

    private String name;
    private double price;

    //指明商品比较大小的方式:照价格从低到高排序,再照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
        //        System.out.println("**************");
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
                //                return 0;
                return -this.name.compareTo(goods.name);
            }
            //方式二:
            //           return Double.compare(this.price,goods.price);
        }
        //        return 0;
        throw new RuntimeException("传入的数据类型不一致!");
    }
    // getter、setter、toString()、构造器:省略
}

三 、Comparator(定制排序)

背景:
当元素的类型没实现 java.lang.Comparable 接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序

说明:
重写 compare(Object o1,Object o2) 方法,比较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2;
如果返回0,表示相等;
返回负整数,表示o1小于o2

public void test1(){

        String[] arr = new String[]{"AA","kk","bb","zz","cc","dd","mm"};

        //匿名的方式
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //写具体的比较代码
                return 0;
            }
        });

        System.out.println(Arrays.toString(arr));
    }
@Test
    public void  test2(){

        Goods[] goods = new Goods[2];
        goods[0] = new Goods("产品1",15.5);
        goods[1] = new Goods("产品2",15.6);

        Comparator com = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Goods && o2 instanceof Goods){
                    Goods g1 = (Goods)o1;
                    Goods g2 = (Goods)o2;
                    if(g1.getName().equals(g2.getName())){
                        return -Double.compare(g1.getPrice(),g2.getPrice());
                    }else{
                        return g1.getName().compareTo(g2.getName());
                    }
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        };

        Arrays.sort(goods,com);
        System.out.println(Arrays.toString(goods));
    }
class Goods implements Comparable{
    private String name;
    private double price;

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    //指明商品比较大小的方式:照价格从低到高排序,再照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
                //                return 0;
                return -this.name.compareTo(goods.name);
            }
            //方式二:
            //           return Double.compare(this.price,goods.price);
        }
        //        return 0;
        throw new RuntimeException("传入的数据类型不一致!");

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

Java基础之比较器 的相关文章

随机推荐

  • 初识最大熵原理

    一 概述 在日常生活中或者科学试验中 很多的事情发生都具有一定的随机性 即最终产生的结果是随机发生的 我们不清楚这些结果是否服从什么规律 我们所拥有的只有一些实验样本 在这种情况下 我们如何根据现拥有的东西对结果产生一个合理的推断呢 最大熵
  • R语言实用案例分析-1

    在日常生活和实际应用当中 我们经常会用到统计方面的知识 比如求最大值 求平均值等等 R语言是一门统计学语言 他可以方便的完成统计相关的计算 下面我们就来看一个相关案例 1 背景 最近西安交大大数据专业二班 开设了Java和大数据技术课程 班
  • matlab 未定义与‘XXX‘类型的输入参数相对应的函数‘princomp‘

    今天某同学让我帮他看看matlab代码出了什么问题 首先运行代码 出现了第一个问题 这个GetSal函数是一个文件外的自定义函数 一看运行的当前目录和这个函数所在的目录不在同一个目录下 在代码里加入addpath 自定义函数所在目录 即可
  • 网络精通-组播

    400 组播 一次发送一组人接收 组播的应用场景 广播电视 音频会议 电视直播 401 PIM 组播路由协议 运行在中间路由器上 帮助路由器选择最短路径到达终端 402 IGPM 运行在最后一跳路由器和终端上面 用来通知路由器下面是否有终端
  • 微信小程序npm项目构建和使用(按照步奏操作)

    1 微信开发者工具里面新建目录miniprogram目录 文件目录名和红色框名一致 然后在miniprogram目录下新建node modules目录 2 WIN R打开运行输入CMD运行黑窗口 cd到你的项目miniprogram目录 错
  • drop table if exists 多张表_mysql实验--DROP 大表时的注意事项

    概述 我们很多时候都会去drop一些大表 特别是生产环境做操作时 这里主要提一些注意事项 仅供参考 01 相关语法 1 删表 DROP TABLE SyntaxDROP TEMPORARY TABLE IF EXISTS tbl name
  • Prometheus + Grafana 监控Docker

    Prometheus Grafana 监控Docker cAdvisor Container Advisor 用于收集正在运行的容器资源使用和性能信息 k8s中kubelet自带cadvisor监控所有节点 参考 https github
  • SQL注入(一)—— sql手动注入实操

    SQL SQL注入 sql 注入的核心 SQL 手注的一般流程 判断注入点 第一步 判断字段数 第二步 判断回显点 第三步 查询相关内容 第四步 判断库名 判断表名 判断列名 查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网
  • 【语义】如何使用PointNet训练点云数据和点云分割(初探)

    大家好 今天给大家介绍下cvpr2017 一篇文章Pointnet 语义分割 该网络基于tensorflow 写的 非常轻巧方便 但是文章和代码有一定出入 在训练过程中出现过拟合现象 大概训练了10个小时多 1 需要准备的东东 1 Ubun
  • 基于STM32F103RB的模拟液位检测告警系统(已实现)

    这次先看一下老朋友STM32 有关Zigbee的内容 Z stack协议栈和基于Zigbee的环境温湿度 烟雾传感器的环境监测系统 等有时间再更 基于STM32的模拟液位检测告警系统 记得好像是某一届蓝桥杯省赛题 基于STM32告警系统介绍
  • GTSAM曲线拟合与自定义因子

    GTSAM曲线拟合与自定义因子 在 视觉SLAM十四讲 中 第六章讲了最小二乘与曲线拟合 采用了三种方法 手动推导高斯牛顿方法 即自己构造正规方程 J T J x
  • 65nm芯片流片费用_研制自主可控芯片,他们凭实力在国赛中斩金!

    我们终于成功了 近日 在上海举办的 华为杯 第三届中国研究生创 芯 大赛上 来自国防科大电子科学学院的研究生张宇飞 黄力行 张诗清三人小组凭借作品 基于忆阻器的低功耗神经形态视觉处理器 获得全国一等奖 该作品是本次大赛唯一的 忆阻器 类脑芯
  • 电容和频率的关系_交流纯电容电路中电容的容抗、容量和频率以及电压与电流的关系...

    纯电容电路中各量之间的关系 电容容抗 如果不考虑电容器本身存在的泄露电阻影响 可以认为电容器是一个纯电容负载 当电容器两端接在交流电压上 在电压由零增至最大时 对电容器充电 有一充电电流 在电压由最大值降低至零时 电容器放电 有一放电电流
  • 京东商品评论分析

    文章目录 京东商品评论取 一 研究背景 二 爬取数据 2 1 完整代码 2 2 使用说明 三 词云分析 四 情感分析 转自艾派森博客 基于Python爬虫 词云图 情感分析对某东上完美日记的用户评论分析 该项目来源于 腾讯云 Cloud S
  • uses sdk:minSdkVersion 16 cannot be smaller than version 17 declared in library [:flutter_inappwebvi

    0 简述 1 报错信息 2 问题原因 3 解决方案 简述 今天用到flutter的一个第三方webview框架 但是无法正常编译 编译了两次都失败了 报错信息 uses sdk minSdkVersion 16 cannot be smal
  • Java面试题第八天

    一 Java面试题第八天 1 如何实现对象克隆 浅克隆 浅克隆就是我们可以通过实现Cloneable接口 重写clone 这种方式就叫浅克隆 浅克隆 引用类型的属性 是指向同一个内存地址 但是如果引用类型的属性也进行浅克隆就是深克隆 深克隆
  • 空调工作原理

    1 变频空调 工作原理 变频 采用了比较先进的技术 启动时电压较小 可在低电压和低温度条件下启动 这对于某些地区由于电压不稳定或冬天室内温度较低而空调难以启动的情况 有一定的改善作用 由于实现了压缩机的无级变速 它也可以适应更大面积的制冷制
  • 8、es---深入聚合数据分析

    一 bucket与metric 1 bucket相当于mysql的group by 2 metric 对一个数据分组执行的统计 比如说求平均值 求最大值 求最小值 二 实战 1 例1 查询参数及结果说明 GET tvs sales sear
  • 欧拉降幂(广义欧拉降幂)

    第一个要求a和p互质 第二个和第三个是广义欧拉降幂 不要求a和p互质 但要求b和的大小关系 A K A K m m mod m K gt m 1 证明如下 1 若 A m 1 根据欧拉定理 A m 1 mod m 即可轻易得证 2 若 A
  • Java基础之比较器

    文章目录 一 背景 二 Comparable 自然排序 三 Comparator 定制排序 一 背景 Java中的对象 正常情况下 只能进行比较 或 不能使用 gt 或 lt 的 但是在开发场景中 我们需要对多个对象进行排序 言外之意 就需