comparable、comparator接口

说明

Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。

如何实现?使用两个接口中的任何一个:ComparableComparator

Comparable接口的使用举例: 自然排序

  1. 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
  2. 像String、包装类重写compareTo()方法以后,进行了从小到大的排列
  3. 重写compareTo(obj)的规则:
    如果当前对象this大于形参对象obj,则返回正整数,
    如果当前对象this小于形参对象obj,则返回负整数,
    如果当前对象this等于形参对象obj,则返回零。
  1. public class Goods implements Comparable{
  2. private String name;
  3. private double price;
  4. public Goods() {
  5. }
  6. public Goods(String name, double price) {
  7. this.name = name;
  8. this.price = price;
  9. }
  10. public Goods(String name) {
  11. this.name = name;
  12. }
  13. public Goods(double price) {
  14. this.price = price;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public double getPrice() {
  20. return price;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public void setPrice(double price) {
  26. this.price = price;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Goods{" +
  31. "name='" + name + '\'' +
  32. ", price=" + price +
  33. '}';
  34. }
  35. @Override
  36. public int compareTo(Object o) {
  37. if(o instanceof Goods) {
  38. Goods goods = (Goods) o;
  39. if (this.price > goods.price) {
  40. return 1;
  41. } else if (this.price < goods.price) {
  42. return -1;
  43. }
  44. }
  45. return 0;
  46. }
  47. }
  48. public class GoodsTest {
  49. @Test
  50. public void test1() {
  51. Goods[] goods = {new Goods("lianxiang", 12.5), new Goods("huawei", 42), new Goods("xiaomi", 20), new Goods("yongyao", 41)};
  52. Arrays.sort(goods);
  53. for(int i = 0;i < 4;i++){
  54. System.out.println(goods[i]);
  55. }
  56. }
  57. }

Comparator接口的使用:定制排序

背景

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

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

  1. public void test4(){
  2. Goods[] arr = new Goods[6];
  3. arr[0] = new Goods("lenovoMouse",34);
  4. arr[1] = new Goods("dellMouse",43);
  5. arr[2] = new Goods("xiaomiMouse",12);
  6. arr[3] = new Goods("huaweiMouse",65);
  7. arr[4] = new Goods("huaweiMouse",224);
  8. arr[5] = new Goods("microsoftMouse",43);
  9. Arrays.sort(arr, new Comparator() {
  10. //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
  11. @Override
  12. public int compare(Object o1, Object o2) {
  13. if(o1 instanceof Goods && o2 instanceof Goods){
  14. Goods g1 = (Goods)o1;
  15. Goods g2 = (Goods)o2;
  16. if(g1.getName().equals(g2.getName())){
  17. return -Double.compare(g1.getPrice(),g2.getPrice());
  18. }else{
  19. return g1.getName().compareTo(g2.getName());
  20. }
  21. }
  22. throw new RuntimeException("输入的数据类型不一致");
  23. }
  24. });
  25. System.out.println(Arrays.toString(arr));
  26. }

Comparable接口与Comparator的使用的对比

  • Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
  • Comparator接口属于临时性的比较。

【Java】comparable、comparator的更多相关文章

  1. 【Java】Comparable和Comparator接口的区别

    Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象. Java提供了 ...

  2. 【Java】String、StringBuilder和StringBuffer

    [String] 首先,从String类的定义入手,可以看到String类是由final修饰,即不可变的,一旦创建出来就不可修改,因此首先明确,字符串的拼接.截取等操作都会产生新的字符串对象. 观察以 ...

  3. 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息

    今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确 ...

  4. 【Java】流、IO(初步)

    (这部分比较抽象且写的不是很好,可能还要再编辑) [概述] 流:流是一系列数据,包括输入流和输出流.你可以想象成黑客帝国的"代码雨",只要我们输入指令,这些数据就像水一样流进流出了 ...

  5. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  6. 【Java】计算机软件、博客的重要性、编程语言介绍和发展史

    之前学得不踏实,重新复习一遍,打扎实基础中. 记录 Java核心技术-宋红康_2019版 & Java零基础学习-秦疆 文章目录 软件开发介绍 软件开发 什么是计算机? 硬件及冯诺依曼结构 计 ...

  7. 【Java】String、StringBuffer、StringBuilder

    java.lang.String类 概述 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现 String声明为final,不可被 ...

  8. 【java】HashMap、Map、Set、HashMap.put()、HashMap.keySet()、HashMap.entrySet()、Map.Entry内部类

    package com.tn.hashMap; public class Student { private String id; private String name; public Studen ...

  9. 【java】J2EE、J2SE和J2ME的区别

    本文向大家简单介绍一下J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务,也就是提供不同类型的类库. Java2平台包括:标准版(J2SE) ...

随机推荐

  1. SWPUCTF 2019 pwn writeup

    来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...

  2. 打印讲义中的幻灯片编号(O365新功能)

    以下听听文档小程序

  3. 2、动态规划接替套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  4. CF637B Chat Order 题解

    Content 有 \(n\) 个字符串,每次出现这个单词就把这个单词放到队列的队首(若已经出现就把原队列里面的那个单词提到队首),求最后的队列由队首到队尾的元素依次是多少. 数据范围:\(1\leq ...

  5. CF424A Squats 题解

    Content 给定一个长度为 \(n\) 的仅由 x 和 X 组成的字符串,求使得字符串中 x 和 X 的数量相等需要修改的次数,并输出修改后的字符串. 数据范围:\(2\leqslant n\le ...

  6. mpstat 查看多核CPU负载状态

    mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查看所有 ...

  7. JavaScript 判断变量是否为空---三元运算,元组获取值-重组.map()。

    var from_days = getQueryString('from_days'); undefined {'from_days': (from_days) ? from_days : null} ...

  8. JAVA判断是否是移动端设备(手机和平板)访问

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 判断是否为移动端设备访问 * */ public class ...

  9. 晴天小猪历险记之Hill(Dijkstra优先队列优化)

    描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助. ...

  10. .NET Core 实现动态代理做AOP(面向切面编程)

    1.介绍 1.1 动态代理作用 用动态代理可以做AOP(面向切面编程),进行无入侵式实现自己的扩展业务,调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,比如:日志记录.性能统计.安全控制.事务 ...