当前位置: 首页 > news >正文

Java比较器(Comparable接口)

一、说明:java中的对象,正常情况下,只能进行比较地址(==、!=),不能使用 > 或 < 。但是在开发中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。如何实现?使用两个接口中的任何一个:Comparable或Comparator
二、Comparable接口的使用(自然排序:强行对实现它的每个类的对象进行整体排序)

  • 1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式
  • 2.像String、包装类重写compareTo(obj)方法以后,进行了从小到大的排列
    String和Character:按照字符串/字符中字符的Unicode值进行比较
    Date、Time等:后面的日期时间比前面的日期时间大
    Boolean:true 对应的包装类实例大于 false 对应的包装类实例
  • 3.重写compareTo(obj)的规则:
    如果当前对象this大于形参obj,则返回正整数
    如果当前对象this小于形参obj,则返回负整数
    如果当前对象this等于形参obj,则返回零
  • 4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序
  • 5.实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort 进行自动排序
public class CompareTest488 {
    @Test
    public void test1(){
        String[] arr=new String[]{"AA","MM","GG","DD","KK","CC"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    @Test
    public void test2(){
        Goods[] arr=new Goods[5];
        arr[0]=new Goods("lenovoMouse",34);
        arr[1]=new Goods("dellMouse",43);
        arr[2]=new Goods("xiaomiMouse",12);
        arr[3]=new Goods("huaweiMouse",65);
        arr[4]=new Goods("microsoftMouse",43);

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}


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 String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        //指明按照什么方式进行排序:如按照价格从低到高排序,如果价格相等,则按照产品名称从低到高排序
        //方式1:自己写个方法进行排序
        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 this.name.compareTo(goods.name);//调用name(String类型)的compareTo()方法进行比较
                //return -this.name.compareTo(goods.name);//前面加一个"-"号,则是按照产品名称从高到低排序
            }

            //方式2:使用包装类中的比较方法compare
            //return Double.compare(this.price, goods.price);
        }
       throw new RuntimeException("传入的数据类型不一致");
    }
}

相关文章:

  • ESP Insights 支持通过高级筛选进行分组分析
  • 网课答案公众号搭建的题库接口提供
  • 网课答案公众号题库在这里直接搭建使用
  • Elasticsearch: Query string与Simple query string
  • 训练神经网络用什么显卡,cpu可以训练神经网络吗
  • 中秋节到啦!程序媛请大家品尝月饼啊
  • BOM介绍以及应用以及this指向问题
  • python中列表(list)与numpy(array)的区别,行与列与维度的选择
  • js防抖和节流
  • c语言分层理解(c语言指针(下))
  • 中国剩余定理(Chinese remainder theorem, CRT)
  • Windows与网络基础-9-windows基本命令-网络相关操作
  • Label Matching Semi-Supervised Object Detection
  • 【web-利用信息泄露】(10.3)防止信息泄露
  • Vue响应式数据的原理,双向数据绑定,循环渲染中key的应用,过滤器
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 2017年终总结、随想
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • extjs4学习之配置
  • golang中接口赋值与方法集
  • Invalidate和postInvalidate的区别
  • Java,console输出实时的转向GUI textbox
  • js如何打印object对象
  • miaov-React 最佳入门
  • rabbitmq延迟消息示例
  • Redis 中的布隆过滤器
  • 工程优化暨babel升级小记
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 排序(1):冒泡排序
  • 前端设计模式
  • 人脸识别最新开发经验demo
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用SAX解析XML
  • 用element的upload组件实现多图片上传和压缩
  • 优秀架构师必须掌握的架构思维
  • 原生Ajax
  • 自定义函数
  • 阿里云服务器如何修改远程端口?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (02)vite环境变量配置
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (23)Linux的软硬连接
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (一)Java算法:二分查找
  • (一)RocketMQ初步认识
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Linux下编译安装log4cxx
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net反编译的九款神器