Comparator & Comparable

概述

1、都是接口,可实现。
2、都是用于比较、排序。
3、待排序类实现comparable实现排序逻辑,排序逻辑不需要待排序对象本身实现。
4、comparable通过o1.compareTo(Object o2)比较,o1>o2返回正整数,o1=o2返回0,o1<o2返回负整数。comparator通过compare(Object o1,Object o2)比较,o1>o2返回正整数,o1=o2返回0,o1<o2返回负整数。
5、调用方法,comparable:Collections.sort(List),comparator:Collections.sort(List,Comparator)
6、comparable在包java.lang.Comparable下,comparator在包java.util.Comparator下。
7、由于comparable接口需要在待排序对象实现,而comparator可以单独实现,相当于一个外比较器,所以comparable接口的耦合性要强一些,而comparator可以单独实现该接口完成排序比较逻辑的实现,所以是一个比较典型的设计模式中的策略模式。

具体实现

下面是对两种方式的简单举例

public class Compare implements Comparable<Compare> {private String name;private Integer value;@Overridepublic int compareTo(Compare o) {return o.value - this.value;}public Compare(String name, Integer value) {this.name = name;this.value = value;}public static void main(String[] args) {List<Compare> list = new ArrayList<>();Compare c1 = new Compare("aa", 1);Compare c2 = new Compare("bb", 2);list.add(c1);list.add(c2);c1.compareTo(c2);//comparable的方式,需要对象本身实现Comparable接口Collections.sort(list);//comparator的方式,不需要对象本身实现,可以作为一个单独的逻辑。Comparator<Compare> valTmp = new Comparator<Compare>() {@Overridepublic int compare(Compare o1, Compare o2) {return o1.name.compareTo(o2.name);}};//lambda简化表达式Comparator<Compare> valTmp1 = (o1, o2) -> o1.name.compareTo(o2.name);Collections.sort(list, valTmp);Collections.sort(list, valTmp1);}
}

map排序:

Comparator<Map.Entry<String, Double>> valCmp = (o1, o2) -> {// TODO Auto-generated method stubreturn (int) (o2.getValue() * 100 - o1.getValue() * 100);  // 降序排序,如果想升序就反过来
};
//将map转成List,map的一组key,value对应list一个存储空间
List<Map.Entry<String, Double>> list = new ArrayList<>(map.entrySet()); //传入maps实体
Collections.sort(list, valCmp); // 注意此处Collections 是java.util包下面的,传入List和自定义的valCmp比较器

扩展-策略模式简述

1、策略模式是一种行为对象模式。
2、策略模式把行为和环境分割开,针对一组算法或者策略,封装到具有公共接口的独立类中,当出现一种新的算法或策略时,只要扩展公共接口就可以。
3、策略模式主要包含环境(Content):抽象策略的引用以及具体策略的交互;抽象策略(Strategy):抽象策略的共同点,一个接口或者抽象类;具体策略(ConcreteStrategy):具体的策略或算法行为。
4、应用场景:java中的comparator类,可以自定义实现比较排序算法策略;促销活动,可以根据不同的活动折扣定义不同的策略算法;
5、如果使用了多个if-else可以考虑采用策略模式实现。
6、优点:避免客户端参杂多个复杂的算法;避免多重if-else语句;易扩展;缺点:判断逻辑在客户端,需求变更,客户端也需要修改;只适合比较扁平的算法结构;客户端选择算法,需要理解所有的算法功能和作用才能选择;

参考文档

https://blog.csdn.net/qq_51165184/article/details/123997917

小记:Comparator Comparable相关推荐

  1. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

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

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

  3. 不是吧,不是吧,都2020年了,你还不会Comparable和Comparator吗?

    Comparable VS Comparator 引言 直接看例题 Comparable Comparator Comparable VS Comparator 写在前面: 今天学了java的Tree ...

  4. Comparable和Comparator的用法与区别

    一 应用场景: 当对自己定义的数据结构需要进行指定排序的时候,java中给了我们两个接口Comparable和Comparator comparable接口定义一个方法: public interfa ...

  5. Java中Comparable接口和Comparator接口怎么用?

    Java比较器 文章目录 Java比较器 Comparable接口(自然排序) Comparator接口(定制排序) 引文:Java中的对象,正常情况下是不可以用>和<去比较的,只能使用不 ...

  6. Java Comparator使用指南 ---- 看这一篇就够了

    目录 Comparator: Comparator的Default方法: Comparable接口 在Java学习过程中,Arrays.sort()可以说是我写过最多的一个方法之一.但在很多时候,仅仅 ...

  7. java comparator相等_菜鸡的Java笔记 comparator 比较器

    1.数组操作类: Arrays 2.两种比较器的使用: Comparable Comparator 3.实现二叉树算法 content (内容) 1.数组操作类: Arrays Arrays 类一早就 ...

  8. 使用TreeSet和Comparator对集合元素排序

    相关好文合集: SpringBoot整合JPA项目实战 常常急需的基于MVC的信息管理系统(很全) java比较器Comparator/Comparable怎么玩? Java复制一个文件的内容到另一个 ...

  9. 043_集合重要知识点

    一. 集合图解 二. 三个重要的知识点 1. 迭代器 1.1. Iterator迭代器 java.util.Iterator接口 hashNext()方法 next()方法 remove()方法 1. ...

最新文章

  1. 女生零基础学软件测试难不难
  2. 企业网站建设中seo不能缺
  3. There was a problem importing one of the Python modules required to run yum
  4. Thinkphp3.2.3打印上一句执行的sql语句
  5. Cracking Wifi Wpa-Wpa2 in 5 second——Dumpper V.80.8 +JumpStart+WinPcap
  6. Nginx 备战-优化指南
  7. zoeDylan.js框架-数据底层
  8. 计算机专业学术论文精选,计算机科学与技术专业本科生毕业论文精选.doc
  9. 设计灵感|纯文字排版也能让海报引人注目
  10. SU数据新旧格式转换问题
  11. win8计算机里没有用户,win8.1系统没有选择切换账户菜单怎么办|win8.1系统切换用户的方法...
  12. 测试机器学习算法的好坏
  13. Download PuTTY: latest release (0.75) pscp
  14. nginx 安全加固心得
  15. (转)Palantir: 神秘的大数据公司
  16. SVG 与 Canvas:如何选择
  17. Java实现微信H5支付
  18. [论文阅读笔记29]生物医学文本摘要(Biomedical Text Summarization)
  19. Oracle数据库增删改查
  20. undo和redo日志

热门文章

  1. WEB前端学习论坛整理
  2. 基于STM32编译程序,串口实现Hello windows!
  3. 魅族手机刷鸿蒙,魅族“很聪明”:宣布加入鸿蒙,让大家以为手机用鸿蒙,其实不是...
  4. 学习太极创客 — ESP8226 (十三)OTA
  5. JavaSE和 Sql复习
  6. PHP使用Grafika合成图片,生成海报图
  7. 整数数字转读音 num2Voice
  8. python自动化运维之路~DAY6
  9. 【Pyqt实战】1-100算式练习题自动生成器(含UI界面,python代码),可自行选择参数
  10. duilib写个三国杀?