Java比较器

2023-11-09

一.Java比较器的概述

1.为什么要使用比较器?

当java涉及到数组排序时,就会使用到比较器

import java.util.Arrays;
​
public class ComparableTest1 {
​
    public static void main(String[] args) {
        
        String [] arr = {"AA","FF","SS","BB","DD","CC"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

2.实现排序的两种方式:

①自然排序:java.lang.Comparable

②定制排序: java.util.Comparator

3.说明:

java对象中,正常情况下只能进行 == 或 !=比较,不能使用 < 或 > 进行比较,但在实际中,需对多个对象排序,,言外之意就是比较大小,所以这时候就无法满足我们的要求

如何实现?

使用两个接口中的任意一个;

      Comparable或Comparator

一.Conparable接口使用举例

1.像String,包装类等都实现了Comparable接口,重写了CompareTo(obj)方法,给出了比较两个对象大小的方式

2.重写CompareTo(obj)规则:

  • 如果当前对象的this大于形参对象的obj,则返回正整数

  • 如当前对象的的this小于形参对象的obj,则返回负整数

  • 如果当前对象的this等于形参对象的obj,则返回0

3.对于自定义类,如果需要排序,可使自定义类实现Comparable接口,重写CompareTo

()方法,并指明需要如何排序

public int CompareTo(Object o){
        if (o instanceof Goods){    //判断o是否是Goods的实例
           Goods goods = (Goods)o;
           if(((Goods) o).price>goods.price){
               return 1;
           } else if (((Goods) o).price<goods.price){
               return -1;
           } else if (((Goods) o).price==goods.price){
                return 0;
           }
           throw new RuntimeException("输入类型不一致!");
        }
    }

二.Comparator定制排序方法

1.当元素类型没有实现java.lang.Comparable接口,而又不方便修改代码,或者实现了Comparable接口,但给定的排序规则不符合当前所需操作,这时我们就可以考虑实现Comparator接口,从而实现强制对多个对象进行排序操作

2.重写CompareTo(obj1 ,obj 2)方法,比较o1和o2,如果返回值时正数,则o1>o2;如果返回值为负数,则o1<o2;如果返回值为0,则o1==o2

3.可以将Comparator传递给sort()方法(如Collection.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制

4.Comparator实现的栗子:

import java.util.Arrays;
import java.util.Comparator;
​
public class ComparatorTest {
​
    public static void main(String[] args) {
​
        String [] arr = new String[]{"AA","CC","GG","BB","DD"};
​
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1 instanceof String && o2 instanceof String){    //判断o1及o2是否为String类型
                    String s1 = (String)o1;
                    String s2 = (String)o2;
                    return -s1.compareTo(s2);  //调用compareTo方法比较元素大小,添加负号表明为从大到小排序
                }
                throw new RuntimeException("输入不一致!");
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}

三.两种实现方式的对比:

  • comparator接口方式一旦给定,把保证Comparable接口实现类的对象在任何位置都可以比较大小

  • comparator接口属于临时比较器

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

Java比较器 的相关文章

  • 哪个类调用了我的静态方法?

    假设我有一个带有静态方法的 Java 类 如下所示 class A static void foo Which class invoked me 进一步假设 A 类有任意数量的子类 class B extends A class C ext
  • 在 MongoDB Java 驱动程序中如何使用 $filter

    我有一个适用于 MQL 的查询 我需要将其翻译成Java MQL 中的查询如下所示 db
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • Java中的OR运算(BitSet.class)

    如何编写一个程序 该程序需要001010101110000100100 011100010001000011000 000000000010000000000100 作为输入 位 输出将是OR其中 3 个 OR 0 0 0 0 1 1 1
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • Checkstyle - 方法按修饰符排序

    是否可以添加到 checkstyle 规则以按修饰符对类中的方法进行排序 我的意思是开头的公共方法和最后的私有方法 MethodsOrderCheck做这个工作 检查文档 https www qulice com qulice checks
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • 如何使用 Nimbus LookAndFeel 更改 JToolTip 的背景颜色?

    在使用 Nimbus LookAndFeel 的基于 Swing 的 Java 应用程序中 我尝试设置工具提示的背景颜色 因此 我创建了 JToolTip 的子类 并通过重写 createToolTip 在我的组件中使用它 到目前为止一切正
  • 升级到 Tomcat 8 时出现 ClassNotFoundException

    我最近将 NetBeans IDE 从 v7 3 升级到 v8 突然我的应用程序在连接到数据库时在服务器启动时抛出异常 这两个版本的 IDE 之间的唯一区别是后者使用 Tomcat 8 异常日志 javax naming NamingExc

随机推荐

  • AWK Linux文本分析工具

    AWK Linux文本分析工具 AWK是一种速度较快 功能齐全的文本分析工具 可以用来读取输入文件 为数据排序 处理数据 对输入执行计算以及生成报表 实际上 AWK 的确拥有自己的语言 AWK 程序设计语言 允许我们创建简短的程序完成对文本
  • 【微信公众号】JS-SDK页面打开提示realAuthUrl错误

    测试环境好好地功能 上了生产 莫名其妙报错 开始以为是没有设置Js安全接口域名 结果让相应人员一查 已经设置了相应的域名 再看下公众号内的接口权限部分 相关js权限也都是已授权 没办法 只能按照微信文档上的常见错误及解决方法 设置debug
  • 定义一个雇员类Employee,包括属性:姓名,工号,年龄,工资。

    1 定义一个雇员类Employee 包括属性 姓名 工号 年龄 工资 要求 工号的构成方式 入职年月份 性别 3位随机序列码 其中入职年月份格式为yyyyMMdd 性别 枚举 为男记录00 性别为女记录01 随机号码长3 且不能全0或全1
  • opencv python debug记录

    本文将持续记录opencv python使用过程中出现的常见错误和解决方案 1 window cpp 1274 error 2 Unspecified error The function is not implemented 该错误通常表
  • 手机屏幕常见故障_触屏不灵敏、断触怎么回事?手机触摸屏的基本原理与常见问题排查方法介绍...

    手机触摸屏断触是怎么回事 大家在日常使用中可能会碰到各种各样的触摸屏问题 类似 断触 滑动屏幕不跟手 输入法打字不灵敏 游戏中多点触摸不灵敏 等问题 下面咱们从利用排除法来进行排查定位 想要弄清手机触屏这一块断触是怎么回事的小伙伴千万不要错
  • Cefsharp中清除缓存,cookie和浏览器数据

    Cefsharp在wpf中清除缓存 cookie和浏览器数据 我正在开发一个使用cefsharp浏览器作为其一部分的银行设备上的应用程序 因为这个应用程序将被任何人使用 它不应该保存下一个用户可以看到的来自先前用户的任何数据 我想在关闭后清
  • Java实现短信验证码功能(利用容联云,个人测试,不需要项目上线)

    前提 开发环境 jdk1 8 idea2020 准备工作 1 登录容联云官网https www yuntongxun com 2 按照提示注册一个容联云账号 3 注册完成点击控制台如下页面 需要记住 ACCOUNT SID AUTH TOK
  • android boot.img 拆包,修改adb 具有root权限,以i9250为例

    Android 系统的rom最主要的就是3个文件 boot img system img userdata img 其中boot img 存放着内核以及Android系统的配置信息 比如android系统各文件夹的读写权限 adb 的权限
  • 个人学习笔记(二)

    在安装 ahocorasick库是碰到了许多问题 首先是安装好anaconda 配置好Python环境后输入conda install pyahocorasick报错 如图 然后尝试用pip install pyahocorasick 也出
  • java httpclient的digest验证(可恨,找遍全网没有靠谱的,不是少包就是少文件。含泪整理o(╥﹏╥)o~~~~)

    背景 调用第三方接口 使用的是digest auth鉴权方式 basic auth和digest auth比较 basic认证是把用户和密码通过base64加密后发送给服务器进行验证 Basic认证过程简单 每次请求都有发送密码 安全性较低
  • 变量那些事

    什么是变量 变数或变量 是指没有固定的值 可以改变的数 变量以非数字的符号来表达 一般用拉丁字母 变量是常数的相反 变量的用处在于能一般化描述指令的方式 结果只能使用真实的值 指令只能应用于某些情况下 变量能够作为某特定种类的值中任何一个的
  • 开心档-软件开发入门之MongoDB 创建集合

    作者简介 每天分享的MongoDB 创建集合学习经验 和学习笔记 座右铭 有自制力 做事有始有终 学习能力强 愿意不断地接触学习新知识 个人主页 iOS开发上架的主页 前言 本章将会讲解MongoDB 创建集合 目录 MongoDB 创建集
  • 电子设计竞赛(4)-常用的两种PID算法

    公众号关注 大鱼机器人 设为 星标 重磅干货 第一时间送达 1 什么是PID PID 控制器以各种形式使用超过了 1 世纪 广泛应用在机械设备 气动设备 和电子设备 在工业应用中PID及其衍生算法是应用最广泛的算法之一 是当之无愧的万能算法
  • 爬虫工作中代理失效了怎么处理?

    Hey 亲爱的爬虫小伙伴们 是不是经常在爬虫的工作中遇到代理IP失效的问题 别着急 今天我来分享一些应对代理失效的妙招 这些方法简单易行 让你爬虫顺利进行 一 为什么代理会失效 在爬虫过程中 使用代理IP是常见的手段 它可以帮助我们隐藏真实
  • Could not find a declaration file for module 'vue-xxx'.

    我尝试添加到项目中的任何第三方Vue js库都会引发以下错误 Could not find a declaration file for module vue xxx Could not find a declaration file fo
  • MySQL 中的共享锁、排他锁与意向锁

    共享锁 Share Lock 共享锁又称读锁 简称 S 锁 一个事务获取了一个数据行的共享锁 其他事务能获得该行对应的共享锁 但不能获得排他锁 即一个事务在读取一个数据行的时候 其他事务可以并发读取数据 但不能对该数据行进行增删改 直到已释
  • 【Mybatis】Mybatis的介绍以及使用

    Mybatis的介绍以及使用 https www cnblogs com kenhome p 7764398 html resultMap的用法以及关联结果集映射 https blog csdn net qq 42780864 articl
  • N1盒子刷机经验分享

    小白入坑N1经验分享 n1的玩法很多 价格也很实惠 所以前几天也入手了一个 但是对这个小盒子是一无所知 完全摸不着方向 整天在恩山逛 恩山大佬很多 干货也很多 因此我折腾了几天 反复看了几个精品帖 算是有了点体会 但是 大佬们分享的帖子虽然
  • catalina 无法验证macos_macOS 10.15 Catalina无法打开app,提示“因为无法确认开发者身份”问题的解决方法......

    概述 本文最后更新 2020年5月4日 不少用户升级到macOS Catalina 10 15之后 遇到了网上下载的app无法运行的问题 出现以下几种提示 无法打开 xxx 因为无法确认开发者的身份 xxx 已损坏 无法打开 您应该将它移到
  • Java比较器

    一 Java比较器的概述 1 为什么要使用比较器 当java涉及到数组排序时 就会使用到比较器 import java util Arrays public class ComparableTest1 public static void