java.util 包下接口 Comparator

  • 可以将 Comparator 接口的实例传递给 sort 方法(如 Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

 int compare(T o1, T o2)
方法详细信息
o1--要比较的第一个对象。 o2--要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException --如果参数的类型不允许此 Comparator 对它们进行比较。

可通过重写Comparator接口中的抽象方法compare,自定义元素的排序方式。

  • Compare的返回值反应的是两个参数的权重,返回值正整数时,前者(o1)权重大,返回值为负整数时,后者(o2)权重大。然后排序结果按照权重(注意这里不是值的大小)由小到大进行排序。即权重默认升序排列。

例:o1 =4 ,o2 = 6;return o2 – o1; {即返回值为正数,即为1,那么前者权重大,排序为o2,o1;
即为6,4,值降序排列}return o1 – o2; {即返回值为负数,即为-1,那么后者权重大,排序为o1,o2;
即为4,6,值升序排列}参数为接口时,可以使用lambda表达式。
1) Lambda表达式的标准格式为:(参数类型 参数名称) ‐> { 代码语句 }1. 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。 2. ->是新引入的语法格式,代表指向动作。 3. 大括号内的语法与传统方法体要求基本一致。
2) Lambda省略格式1. 小括号内参数的类型可以省略;  2. 如果小括号内有且仅有一个参,则小括号可以省略; 3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
3) Lambda的使用前提1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。2. 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

例:用Comparator接口对学生对象实现排序(三种方法)

public class ComparatorTest {public static void main(String[] args) {// 创建学生对象Student2 s1 = new Student2("zs", 22, 77);Student2 s2 = new Student2("ls", 21, 88);Student2 s3 = new Student2("ww", 25, 66);Student2 s4 = new Student2("zl", 22, 99);Student2 s5 = new Student2("长风", 26, 59);// 填充数组Student2[] students = {s1, s2, s3, s4, s5};// 排序前System.out.println("排序前");System.out.println(Arrays.toString(students));// 排序 使用带比较器的sort方法Arrays.sort(students, new MyComparator());// 使用匿名内部类Arrays.sort(students, new Comparator<Student2>() {@Overridepublic int compare(Student2 o1, Student2 o2) {return o1.score() - o2.score();}});// 使用lambdaArrays.sort(students, (stu1, stu2) -> stu2.score() - stu1.score());// 排序后System.out.println("排序后");System.out.println(Arrays.toString(students));}
}class Student2{String name;int age;int score;public Student2(String name, int age, int score) {this.name = name;this.age = age;this.score = score;}@Overridepublic String toString() {return "Student2{" +"name='" + name + '\'' +", age=" + age +", score=" + score +'}';}
}// 手写实现类
class MyComparator implements Comparator<Student2> {@Overridepublic int compare(Student2 o1, Student2 o2) {// 按照年龄从小到大进行排序//return o1.age() - o2.age();return o2.age() - o1.age();}
}

Java的comparator接口中compare方法比较原理相关推荐

  1. Java Comparator接口中compare方法使用

    经常忘记,记录一下. 首先看一下部分排序源码 //----------------------------Collections.sort------------------------------- ...

  2. 利用Collections.sort方法重写Comparator接口的compare方法对list集合排序

    Collections.sort()使用该方法实际是重写Comparator接口的compare方法实现排序://传入参数list集合,Comparator接口 T:list的元素类型 //如List ...

  3. 关于Compartor接口中compare方法的升序,降序

    package com.itheima_03;//Compartor返回1,-1,0. // 1是前者权重大,-1是后者权重大,0表示二者权重相等.(o1表示前者,o2表示后者) //最后按照权重由小 ...

  4. Java Comparator接口和compareto方法总结

    Comparator接口中compare(Object o1,Object o2)方法是java.util.Comparator接口的方法,它实际上用的是待比较对象的compareTo(Object ...

  5. java to对象_java中同类对象之间的compareTo()和compare()方法对比分析

    首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显然是没有意义的. java中同类对象之间的比较又分为两种,基 ...

  6. java:compareTo和compare方法之比较

    compareTo compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable ...

  7. Java中Comparator和Comparable之间的区别

    常见的面试问题之一是"比较器和可比较器之间有什么区别". 或"您将如何通过其ID或名称对员工对象集合进行排序".为此,我们可以使用两个接口,即Comparato ...

  8. 【Java基础·Comparator多字段排序】

    [Java基础·Comparator多字段排序] 需求 对指定List按照 身份证号.姓名.入学时间倒序排列 版本1 package com.biaogexf.tools;import lombok. ...

  9. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

最新文章

  1. PCL、XPS转换成PDF的控件activePDF Meridian​
  2. JS - Class继承
  3. SpringMVC 返回json的两种方式
  4. java main函数_一行JAVA代码如何运行起来?
  5. 【ES7(2016)】幂运算符**
  6. 140_Power BIPower Pivot之降维展示同类型比较
  7. H5 video的使用
  8. Raki的读paper小记:How to Fine-Tune BERT for Text Classification?
  9. IDEA 错误 找不到或无法加载主类(完美解决)
  10. 动态规划——01背包——精卫填海
  11. JAVA算法:三角形周长(JAVA版本算法)
  12. 操作系统—CPU调度与内存管理
  13. i58400升级可以换什么cpu_罗敏:老式碰锁可以换什么锁?老式门锁该如何
  14. 嵌入式入门基础知识有哪些?
  15. 联想拯救者R720加装固态硬盘过程中遇到的小问题
  16. 前端常见图片格式整理
  17. linux在u盘中运行,在U盘中直接运行Linux的详细步骤
  18. OGC标准介绍 12
  19. HTML-浮动与清除浮动、文字属性、动画效果
  20. 此错误通常是由宏安全性设置造成的

热门文章

  1. 在国企的日子(第一章 面试)
  2. J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
  3. Echarts:在series里配置如下itemStyle,即可实现值大于0时为红色,小于0时为绿色
  4. c语言中target,C 11:使用std :: function :: target()指向成员函数的指针
  5. IntelliJ IDEA中出现JSON注释异常JSON standard does not allow comments。。
  6. 从职业赌徒到货拉拉创始人,一文带你了解周胜馥的传奇人生
  7. 全球与中国眼动追踪硬件市场现状及未来发展趋势2022-2028
  8. 专利代理人考试2021-09-09
  9. 【计算机网络微课堂】5.8 TCP的运输连接管理
  10. 车行易携手睿象云:告警管理体系全升级