Java中自定义比较器

  • 1、数组比较器
  • 2、集合比较器
  • 3、自定义类比较器

今天写算法题的时候需要用到数组排序,而且是自定义的,这块知识欠缺,就进行了相应的资料查询。

以我自己的理解,Java中自定义比较器有三种

1、数组比较器

数组比较器用到了Arrays的工具类,此类中提供了许多静态方法,其中sort是默认升序,并且我查看了sort的源代码,使用的是快速排序:

快速排序相信大家都不陌生,这里不再多说了。
刚才说到sort默认是升序,如果我们想要降序呢?

Arrays提供了自定义实现排序,就是自己重新实现Comparator(下面要解释)

Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型@Overridepublic int compare(int a, int b){  // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型return a - b;   升序// return b - a;   降序// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的//两个元素的位置,返回值为负数时,不交换。 }})

但是我看大家的写法用到了lambda表达式(JDK8新特性),更加简洁了


lc406:

public int[][] reconstructQueue(int[][] people) {//贪心//两个维度,先按身高排序,再按大的身高的k插入//按身高排序Arrays.sort(people,(a,b) ->{if (a[0] == b[0]) {return a[1] - b[1];  //升序}else {return b[0] - a[0];  //降序}});LinkedList<int[]> queue = new LinkedList<>();for (int[] p : people) {queue.add(p[1],p);   //根据k插入,也即是下标}return queue.toArray(new int[people.length][]);}

2、集合比较器

在数组中使用Arrays作为工具类,在集合中的工具类为Collections
原理其实都一样。

3、自定义类比较器

上面讲到的都是java自身的数据类型包装类,如果我们自己定义的类需要比较的话,我们有两种方法:

  • 实现Comparable接口
  • Comparator接口

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

class Goods implements Comparable {private String name;private double price;//按照价格,比较商品的大小@Overridepublic int compareTo(Object o) {if(o instanceof Goods) {Goods other = (Goods) o;if (this.price > other.price) {return 1;} else if (this.price < other.price) {return -1;}return 0;}throw new RuntimeException("输入的数据类型不一致");}//构造器、getter、setter、toString()方法略
}

2、
使用Comparator时需要实现compare方法,也即是我们上面Arrays.sort所用到的。

源码中只有一个compare类

@FunctionalInterface :函数式接口,意思是接口中不能再添加其他的类;

Goods[] all = new Goods[4];
all[0] = new Goods("War and Peace", 100);
all[1] = new Goods("Childhood", 80);
all[2] = new Goods("Scarlet and Black", 140);
all[3] = new Goods("Notre Dame de Paris", 120);
Arrays.sort(all, new Comparator() {@Overridepublic int compare(Object o1, Object o2) {Goods g1 = (Goods) o1;Goods g2 = (Goods) o2;return g1.getName().compareTo(g2.getName());}
});

Java中自定义比较器相关推荐

  1. java中自定义比较器_Java中的比较器:自定义规则!!!

    比较器 Java语言中的比较器分为两种: Comparable比较器:Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序".(作用在实体 ...

  2. Java中自定义注解的使用

    Java中自定义注解的使用 一般来说,市面上有一些的框架,企业都不会直接拿过来就用,通过会做二次开发或封装,为了更加适配自己的开发规范和业务.那么在封装或适配的过程中,自定义注解就起着比较重要的作用. ...

  3. java自定义外部接口_如何使用可外部化的接口在Java中自定义序列化

    java自定义外部接口 在上一篇文章"用示例介绍的有关Java序列化的一切"中 ,我解释了如何使用以下方法序列化/反序列化一个对象 Serializable接口,还说明了如何使用w ...

  4. 如何使用可外部化的接口在Java中自定义序列化

    在上一篇文章"用示例介绍的有关Java序列化的一切"中 ,我解释了如何使用以下方法序列化/反序列化一个对象 Serializable接口,还说明了如何使用writeObject和r ...

  5. java中自定义设置cookie(设置同父域解决跨域获取值得问题)

    1.先在web环境下任意地方获取request,response,session,备用 ServletUtils.java import java.io.IOException; import jav ...

  6. Java 中的比较器

    所谓的比较器指的就是进行大小关系的确定判断,下面首先来分析一下比较器存在的意义 比较器问题的引出 如果要进行数组操作,首先会使用的是 java.util.Arrays 的操作类完成,这个类里面提供有绝 ...

  7. 谈谈 Java 中自定义注解及使用场景

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:快给我饭吃 www.jianshu.com/p/a7bedc ...

  8. android自定义比较器,java – 使用自定义比较器排序的集合不起作用

    我创建了一个自定义Comparator来对字符串的ArrayList进行排序.我已通过调试器运行它并观察它正确比较和返回值.但是,我的数组没有排序.因为我不熟悉 Java& Android,可 ...

  9. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....

    1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式 ...

  10. java中自定义输入数字格式_Java 创建并使用自定义数字格式、35;###、####.#####和语言环境...

    import java.util.*; import java.text.*; /* nowjava - 时代Java 提 供 */ public class DecimalFormatDemo { ...

最新文章

  1. 服务运行一段时间,redis缓存就不可用,原来是这个锅!
  2. Docke的WEB管理工具
  3. 谈谈android反编译和防止反编译的方法
  4. 前端传值后端接收不到_web前端和后端哪个好
  5. WCF中的ServiceHost初始化两种方式(宿主)
  6. [转载]理解OAuth 2.0
  7. 你的特斯拉Model 3,只需要一台手机就能偷走它
  8. html5站点是什么意思,html5是什么意思(html5是什么技术)
  9. iTextSharp 使用详解
  10. 方差分析 交互效应和无交互效应
  11. 大规模定制有哪些标志性的特点
  12. hivesql uv
  13. 卸载安装office2013、office2016遇到的问题 - 错误1402,安装程序无法打开注册表项。
  14. iVMS-4200 Vs区别_高中和大学的这些区别虽鲜为人知,却字字有据,句句真实
  15. 通过图片像素计算图片大小的方法
  16. 拼多多校招-----六一儿童节(python)
  17. excel电子表格插件_电子表格的美好时光
  18. 中心极限定理-纯理解无公式
  19. 用Python一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  20. 静态电影网站模板A(html+css+js)

热门文章

  1. 计算机Numlock键的功能,电脑开机numlock灯不亮怎么办 NumLock数字锁定键方法
  2. 故障:笔记本开机时自动打开 NumLock 键
  3. 什么叫状态服务器 博客,pending是什么意思?HTTP Status pending (进程信号的未决状态)详解...
  4. 公共DNS服务器IP地址
  5. 全球与中国纳米铝硅合金粉末市场深度研究分析报告
  6. UE4 虚幻引擎,光照系统。BP_Sky_Sphere 白天黑夜效果
  7. 广告牌定时器怎么设置时间_广告牌定时器时间到了灯箱不亮怎么回事?
  8. (啤酒,红酒,白酒,料酒)豆瓣(剁椒)鲫鱼做法记录
  9. c语言中fabs是什么意思,c语言fabs是什么意思_后端开发
  10. debug——生成log