Comparator :是一个接口,有compare(a,b)方法,主要用来排序。

compare(a,b) 方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

compareTo:String 是字符串,它的比较用compareTo方法,它从第一位开始比较, 如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型。
obj1.compareTo(obj2)如果该方法返回0,则表示两个对象相等,如果该方法返回一个正整数,则表明obj1大于obj2;如果该方法返回一个负整数,则表明obj1小于obj2。

当compare(a,b)方法返回值大于0(为true)时,交换o1和o2
以上结论参考:
Java中comparator接口与compare方法的实现
compareTo()方法

为什么写成compare(a,b){return a - b;}表示从小到大排序了?

镜像问题:compare(a,b){return b - a;}表示从大到小排序

public int compare(a,b){return a - b;
}
/*
情况一:a > b
因为a > b所以a - b大于0,交换a,b,大的数排在了后面,因此是从小到大排序。情况二:a < b
因为a < b所以a - b小于0,a,b不交换,小的数在前面,大的数在后面,因此还是从小到大排序。
*/

比较器的匿名内部类写法

以NC153 信封嵌套问题为例
比较大小最好不要使用减法,当遇到[[-2147483646,-2147483645],[2147483646,2147483647]] 就过不了了,这是因为差值过大而产生溢出。sort的时候不要用a-b来比较,用小于号比较做三目运算可以避免溢出。

把Comparator的泛型写做数组元素的类型,这样可以把二维数组看作元素是数组的一维数组,于时就可以给二维数组排序了。

Arrays.sort(letters,new Comparator<int[]>(){public int compare(int[] a, int[] b){if(a[0] == b[0]){return b[1] < a[1] ? -1 : 1;}return a[0] < b[0] ? -1 : 1;}
});

注意compare方法的参数类型要和匿名内部类的泛型一致,否则编译不通过,比如下面这个写法是不通过的。

//LeetCode451. 根据字符出现频率排序
Collections.sort(list,new Comparator<Character>(){public int compare(char a, char b){if(map.get(a) != map.get(b)){return map.get(b) - map.get(a);}return a - b;}
});

加入给map的entry排序可以这样写:

PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {return e1.getValue() - e2.getValue();}
});
PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>((e1, e2) -> e1.getValue() - e2.getValue());

比较器的lambda写法

以NC85 拼接所有的字符串产生字典序最小的字符串中的小顶堆创建为例。

PriorityQueue<String> minHeap = new PriorityQueue<>((a,b)->{return (a+b).compareTo(b+a);
});

Comparator、compare、compareTo相关推荐

  1. Notepad++实用插件整理(Json Viewer、Compare、Explorer、AnalysePlugin)

    文章目录 插件名称 安装方式 Notepad++是一款小巧.高效的工具,支持多种编程语言,其丰富强大的插件使得程序员效率++. 插件名称 1.Json Viewer: 用于格式化Json数据 2.Co ...

  2. 12、IC验证面试88问——phase机制、TLM、AP、sequencer、仲裁机制、vif、cb机制

    文章目录 Q51:main_phase要如何跳转到reset_phase? Q52:UVM 组件的通信方式 TLM 的接口分类和用法,peek 和 get的差异. Q53:Analysis port ...

  3. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

    1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...

  4. Java15-day06【Set、HashSet、LinkedHashSet、TreeSet、Comparable、Comparator、泛型类、可变参数的使用】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  5. JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)

    第2节 集合(下) 一.Set接口 java.util.Set 接口和 java.util.List接口一样,同样继承自 Collection接口,它与Collection接口中的方法基本一致,并没有 ...

  6. 菜鸟学JAVA之——常用类(StringBuffer、StringBuilder、Comparable、Comparator等)

    文章目录 常用类 字符串相关的类 一.String类及常用方法 二.StringBuffer.StringBuilder JDK 8 之前的日期时间API 一.System静态方法 二.Date类 三 ...

  7. 比较(==、equals、Comparable、Comparator)

    对象值相等的比较 "=="和equals p == q 表示的是 p 和 q 两个引用指向同一个对象 p.equals(q) 表示 p 指向的对象 和 q 指向的 对象是否是值语义 ...

  8. Collection、list、map、set、comparable、comparator

    Collection 数组: 缺点:(1)长度固定,如果要扩容等需要程序自己维护,如果要删除和插入,程序员要移动元素等 (2)数组只支持"可重复,顺序存储"特点,比较单一 集合:很 ...

  9. Java:Stream三部曲(一):函数式接口的理解与常用示例(Runnable、Comparator、Callable、Consumer、Predicate、Supplier、Function)

    目录 摘要 一.函数式接口(Functional Interface) 定义 附注 示例 二.JDK中常用的函数式接口 概览 1. Runnable 2. Comparator 用途:一个比较顺序的方 ...

最新文章

  1. Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?
  2. CSS(1)——如何使用css选择器
  3. Disable anchor tag的javascript代码(兼容IE和Firefox)
  4. 一学就废的三种简单排序【冒泡、插入、选择】
  5. springsecurity文档_今天学了springsecurity
  6. 微课|中学生可以这样学Python(例11.4):tkinter版图片查看器
  7. 知名网络安全专家访谈记
  8. STM32跑html协议,STM32移植SBUS协议
  9. Mongodb分片学习
  10. Linux环境安装python3报错:“HTTP Error 416 Requested Range Not Satisfiable 正在尝试其它镜像”的解决方法
  11. lightroom最新版本下载_lightroom官网下载
  12. 马上消费首份报告曝光,聚焦6大方向践行社会责任
  13. 使用WebSocket实现聊天室
  14. QT时间差计算的两种方法代码
  15. 巨简单 在eclips上面新建一个网页动态项目
  16. 杭电。刘春英。老师 写给计算机软件专业的大学生
  17. magics24安装教程|magics中文版下载
  18. NASA通过WebAPP提醒你抬头看看人类连续常驻达12年的太空站
  19. 厚物科技CPCI机箱CPCI控制器CPCI笔记本HW-3646
  20. 【JAVA项目实战】【图书管理系统】用户删除功能【Servlet】+【JQuery】+【Mysql】

热门文章

  1. win10安装linux子系统详细教程(非虚拟机方式)
  2. rk3568 | 瑞芯微平台GPIO引脚驱动编写
  3. Samba服务器搭建与配置
  4. chrome模拟手机浏览器方法
  5. Java集合系列(一):List、Map、Set的基本实现原理总结
  6. Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!
  7. 《趣味知识博文》小W与小L带你聊天式备考CDA Level Ⅰ(六)
  8. 物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建
  9. 【微信支付】APP支付和APIJS支付
  10. 服务器显示器多少寸合适,购买别冲动!先看多大的显示器适合你