1.Comparator接口的使用

今天学习了java.utils包下的Comparator接口。该接口代表一个比较器。 提到比较的接口, 你一定会想起来Comparable。这个俩个接口都有比较的作用。

提到了comparable接口, 就要介绍一下这两个接口的区别。

从字面意思区别这个俩个接口的话, 如下:

  • comparator 翻译过来是比较**器 **, 即比较的器具,工具。
  • comparable 翻译过来是可比的, 是一个修饰词, 修饰词就是修饰事物的, 即使某个物具有可比性。

这样,你大体对这两个接口的使用方法和区别有了初步的了解。

1.1.该接口的作用

我们回到我们的Comparator ,该接口代表一个比较器。java数组工具类和集合工具类中提供sort方法的排序就是使用该接口来处理的。

Arrays.sort(T[],Comparator<? super T> c);  #数组工具类sort
Collections.sort(List<T> list,Comparator<? super T> c); #集合工具类sort

1.2.使用场景

通常用到比较的地方就是 **排序 **, 排序一般比较的是=

此外, 还有些地方比较的是=或者!=

1.3.接口常用的方法

compare、 和equals 是用俩个常用方法, 因此实现该接口, 一般就重写这两个方法。

其中compare是比较参数顺序, 就是在排序时使用的。

equals是我们上面说到的比较是否想等。

1.4. 常用方法详细介绍

1.4.1.遵守的规则

我这里只介绍compare方法, 这个方法是用来比较俩个参数的顺序的。文档给出的介绍如下:

文档中提到了实现compare必须要遵守三个性质:

  • 相反性: sgn(compare(x, y)) == -sgn(compare(y, x))所有xy。我们这里称呼这个为相反性吧,这个形式很好理解

  • 传递性:实施者还必须确保关系是可传递的: ((compare(x, y)>0) && (compare(y, z)>0))意味着compare(x, z)>0

  • 最后就是对compare(x, y)==0的解释: 如果他们x y满足compare(x, y)==0, 他们俩与任意一个z 的比较结果想等。

这是官方提出要遵守的几条规则, 所以我们在编写时注意遵守一下就是了。

注意:以上的相反性是我个人为了便于理解, 而对它的称呼。

1.4.2.返回值

上面我呢介绍了编写该方法索要遵守的规则, 下面我们提一下返回值。

该方法返回值为int ,分三种:

  • 正数
  • 0
  • 负数

因为排序有多种, 并不是返回什么值就要交换, 它只是定义了一个升降的规则。升序和降序的实现, 如下。

1.5. 升序和降序的实现

  • 升序

     public int compare(T u1, T u2) {if(u1 > u2) return 1;if(u1 < u2) return -1;return 0;}
    
  • 降序

     public int compare(T u1, T u2) {if(u1 < u2) return 1;if(u1 > u2) return -1;return 0;}
    

1.6. 示例

看完了介绍一定很懵, 下面是实践一下就可以了。

package other;
import java.util.*;public class ComparatorTest {static class User{String name;int age;public User(String name, int age){this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}}/**** 自定义比较器* 根据姓名降序*/static class MyComparatorName implements Comparator<User> {@Overridepublic int compare(User u1, User u2) {return u1.getName().compareTo(u2.getName())* -1;}}/**** 自定义比较器* 根据年龄升序*/static class MyComparatorAge implements Comparator<User>{@Overridepublic int compare(User u1, User u2) {//这里, 我遵守了他的三个规则。 //1. u1 - u2 返回的结果 == - (u2-u1)返回的结果//2.  u1 - u2 <0 , u2 - u3< 0 . 所以 u1 - u3 < 0, 我遵守了传递性 。//3. 第三条性质就不用说了吧return u1.getAge() - u2.getAge();}}public static void printUsers(List<User> list){for(User u: list){System.out.println(u.getName()+"----"+u.getAge());}}public static void main(String[] args) {List<User> list = new ArrayList<User>();User user1 = new User("a", 2);User user2 = new User("d", 0);User user3 = new User("c", 3);list.add(user1);list.add(user2);list.add(user3);Collections.sort(list, new MyComparatorName());printUsers(list);list.sort(new MyComparatorAge());printUsers(list);}
}

1.7.参考

  • Comparator接口的使用
  • 【java】Comparator的用法
  • jdk8 api文档

Comparator接口的使用相关推荐

  1. Java中比较对象的两个接口Comparable接口和Comparator接口

    2019独角兽企业重金招聘Python工程师标准>>> jdk文档是这样介绍的 1.  public interface  Comparable<T>:此接口强行对实现它 ...

  2. Java基础之Comparable接口和Comparator接口的比较

    前言 就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那 ...

  3. java arraylist comparable_Java 两种ArrayList集合自定义对象属性排序,Comparator接口 或 Comparable接口...

    1,Comparator接口 -- 重写Comparator public class User { private String id; private String name; public Us ...

  4. Comparable接口和Comparator接口

    目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...

  5. Java之——利用Comparator接口对多个排序条件进行处理

    转载自:http://blog.csdn.net/l1028386804/article/details/56513205 膜拜大神··· 一.需求 假设现在有个如此的需求:需要对一个这样的雇员列表进 ...

  6. Comparable接口与Comparator接口

    [Comparable和Comparator源码] java.lang.Comparablepublic interface Comparable<T> {public int compa ...

  7. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 Comparator 接口 , 对 ArrayList 集合中的元素排序无效 ; 打印之后没有进行排序 ; 错误代码就不贴出来了 , 随便搜索 ...

  8. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  9. 007_JDK的Comparator接口

    1. JDK1.8中的Comparator接口 package java.util;public interface Comparator<T> {int compare(T o1, T ...

  10. Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂

    引言 在平时写Java的程序的时候,如果要进行一些基本类型的变量的比较,可以很方便得调用Math.max().Math.min()等方法,如果要对数组或者列表进行排序,也可以用Arrays.sort( ...

最新文章

  1. 使用libevent多线程验证Linux上的服务器惊群现象
  2. 参考答案:05 实对称矩阵与二次型
  3. WPF一步一脚印系列(1):万事起头难
  4. [计组]寄存器和存储器的区别
  5. 领域应用 | 为电商而生的知识图谱,如何感应用户需求?
  6. Java Socket笔记-利用tcp socket搭建CS模型
  7. 【python教程入门学习】普通人学python有意义吗
  8. gitlab服务器代码存储位置,gitlab 数据目录迁移
  9. 设计算法统计二叉树(采用二叉链存储结构)中结点值为x的结点个数_20题,算法工程师能力评估测试来啦...
  10. 1041: C语言程序设计教程(第三版)课后习题9.8
  11. matplotlib--python的数据可视化入门
  12. centos 6 安装 php 5.5 fpm支持
  13. MT5 MT4 zigzag指标的算法详解
  14. 最新python大数据毕业设计选题推荐(三)
  15. Linux 下常见的四款chm查看器比较
  16. 爱莫logo里的大千世界 | 精彩传送门
  17. 算法创作|栈的应用——括号匹配问题解决方法
  18. 最优化理论极简入门(第一部分):最优化条件和KKT条件
  19. python北京房价预测_《安家》热播,我用Python对北京房价进行了分析,结果……...
  20. 速看|快速软件开发框架突破信息孤岛,高效实现数字化发展!

热门文章

  1. 可禁用计算机服务,台式电脑哪些服务不能禁用?或者哪些服务必须禁用?
  2. 如何使用Elementor和OceanWP创建WordPress网站
  3. C语言编写杨辉三角(二维数组方法)
  4. iOS LaunchScreen.storyboard 更新图片不生效
  5. python安装时,官方目录web-based与executable区别
  6. 郑商所期货模拟交易日志
  7. 计算机视觉1-历史背景
  8. Exce快速l统计所有行中标红数据的个数【教学常用】
  9. AD360身份管理自动化
  10. bootstarp怎么使盒子到最右边_盒子显示“很抱歉Launchercust 已停止运行”?