文章目录

  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator


自然排序:java.lang.Comparable

Comparable接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序。

实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。

实现Comparable接口的对象列表(和数组)可以通过 Collections.sort
Arrays.sort 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

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

像String、包装类重写compareTo()方法以后,默认可以进行从小到大的排列。

自定义类实现Comparable接口,重写compareTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数 1
如果当前对象this小于形参对象obj,则返回负整数 -1
如果当前对象this等于形参对象obj,则返回零 0

示例:

import java.util.Arrays;class Good implements Comparable{private int price;private String name;public Good(String name,int price) {this.price = price;this.name = name;}@Override//先比较价格从低到高,再比较名称按从大到小public int compareTo(Object o) {if (o instanceof Good){Good other = (Good) o;if (this.price > other.price) return 1;else if (this.price < other.price) return -1;else return -this.name.compareTo(other.name);}throw new  RuntimeException("比较的不是Good!");}@Overridepublic String toString() {return "Good{" +"price=" + price +", name='" + name + '\'' +'}';}
}public class ComparableTest {public static void main(String[] args) {Good[] goods = new Good[5];goods[0] = new Good("dell", 4668);goods[1] = new Good("ipad", 2628);goods[2] = new Good("dell", 688);goods[3] = new Good("huawei", 3229);goods[4] = new Good("xiaomi", 1688);Arrays.sort(goods);System.out.println(Arrays.toString(goods));}
}

Comparable 的典型实现类:(默认都是从小到大排列的)

①String:按照字符串中字符的Unicode值进行比较
②Character:按照字符的Unicode值来进行比较
③数值类型对应的包装类以及BigInteger、BigDecimal:按照对应的数值大小进行比较
④Boolean:true 对应的包装类实例大于 false 对应的包装类实例
⑤Date、Time等:后面的日期时间比前面的日期时间大



定制排序:java.util.Comparator

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。

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

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

还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

import java.util.Arrays;
import java.util.Comparator;class Good {private int price;private String name;public Good(String name,int price) {this.price = price;this.name = name;}@Overridepublic String toString() {return "Good{" +"price=" + price +", name='" + name + '\'' +'}';}public int getPrice() {return price;}public String getName() {return name;}
}public class ComparableTest {public static void main(String[] args) {Good[] goods = new Good[5];goods[0] = new Good("dell", 668);goods[1] = new Good("ipad", 928);goods[2] = new Good("dell", 928);goods[3] = new Good("huawei", 329);goods[4] = new Good("xiaomi", 168);Arrays.sort(goods,new Comparator(){@Override//先比较价格从低到高,再比较名称按从大到小public int compare(Object o1, Object o2) {Good good1 = (Good) o1;Good good2 = (Good) o2;if (good1.getPrice() > good2.getPrice()) return 1;else if (good1.getPrice() < good2.getPrice()) return -1;else return good1.getName().compareTo(good2.getName());}});System.out.println(Arrays.toString(goods));}
}

Java常用类(3)--Java比较器Comparable、Comparator类相关推荐

  1. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码正则表达式...

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年11 ...

  2. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年10 ...

  3. Java常用命令及Java Dump

    线程Dump,包含所有线程的运行状态.纯文本格式. 堆Dump,包含线程Dump,幵包含所有堆对象的状态.二进制格式. Java Dump方法 1.使用Java虚拟机制作Dump 指示虚拟机在发生内存 ...

  4. Java常用API(六)Date 日期类介绍及使用

    一.简单介绍 所在包 : java.util.Date. Date d = new Date(); System.out.println(d); // 打印出的内容是: 月份 日期 时间 时区  年份 ...

  5. Java常用API(五)Math 数学类

    一.概述 Math是最终类,且构造函数被私有化,所以不允许创建对象.但是提供了一系列的静态方法---完全作为了工具类使用. 只提供了初等的运算. 二.常量 E  :底数 ,是所有自然数的底数. PI ...

  6. JAVA两类比较器的区别(Comparable,Comparator)

    内部比较器Comparable 一个类实现了Comparable接口,那么它就有了一个内部比较器,实现了Comparable的类可以调用Collections工具类或Arrays的sort方法进行比较 ...

  7. Java常用注解以及使用场景示例

    Java注解定义 Java注解是Java编程语言中的一种特殊形式的元数据,它们可以用于为程序的各个元素(例如类.方法.字段等)添加额外的信息和属性.注解是在Java 5中引入的,通过在代码中使用注解, ...

  8. java中间件有哪些java常用中间件介绍

    之前给大家介绍了很多的java基础知识,今天同样的也是要给大家介绍这方面的内容,那么对于java中间件你都了解多少呢究竟什么是java中间件比较常用的java中间件都有哪些一起来了解一下吧. 一.什么 ...

  9. java常用类库---比较器(Comparable,Comparator)

    一,本章目标 掌握Comparable比较接口的使用 了解比较器的基本排序原理 掌握Comparator比较接口的使用 二,具体内容 Comparable接口: 之前在Arrays中存在sort方法, ...

最新文章

  1. 9月20华为鸿蒙,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片
  2. 【生活】SSD 接口的分类
  3. python property方法_Python——property(使一个方法看起来就像类属性一样)
  4. oracle数据库连接数超了,oracle数据库当前和最大连接数
  5. 丝蛋白行业调研报告 - 市场现状分析与发展前景预测
  6. P3195 [HNOI2008]玩具装箱TOY DP+优化
  7. 计算机c盘只能新建文件夹,1.C盘只能新建文件夹不能新建文件(用户权限问题)...
  8. 海康工业相机USB接口连接Halcon21后,海康MVS客户端无法打开,如何解决
  9. 华胜天成以精益服务为中国联通构建电子渠道容灾系统
  10. 万字专栏总结 | 离线强化学习(OfflineRL)总结(原理、数据集、算法、复杂性分析、超参数调优等)...
  11. 计算机设备管理器怎么看主板,电脑主板型号信息查看方法
  12. 第十一章 枚举与泛型 总结
  13. 酷睿i9 12950HX怎么样 相当于什么水平
  14. kettle 用cmd bat来运行ktr和kjb
  15. int和Interger区别
  16. python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...
  17. Scrum立会报告+燃尽图(Beta阶段第七次)
  18. PrestaShop支付接口-网银在线支付,在线支付收款,外贸收款
  19. Casio Fx-4800P 计算器测量计算程序
  20. 哪些是不被授予专利权的客体

热门文章

  1. 从Java执行可执行的命令行
  2. Apache Shiro第3部分–密码学
  3. OSGI –模块化您的应用程序
  4. Java Code Geeks Andygene Web原型
  5. Linux 环境变量设置及查看
  6. HH SaaS电商系统的品牌模块设计
  7. 显微镜自动聚焦原理是什么_什么是共聚焦显微镜?你了解过共聚焦显微镜吗?...
  8. 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...
  9. 向 mysql导入数据 源码_MySQL 导入数据
  10. mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)