文章内容参考博客:https://www.cnblogs.com/xujian2014/p/5215082.html

1.Comparable

Comparable是排序接口,当一个类实现了Comparable接口后,就以为着该类支持排序。实现了Comparable接口的类,其组成的数组和列表就可以通过Collections的工具进行自动排序。

而实现了Comparable接口的对象也可以用作有序映射(LinkedHashMap)中的键,或者有序集合中的集合,无序指定比较器Comparator。

  1. public class Person implements Comparable<Person> {
  2. private String name;
  3. private int id;
  4. private int age;
  5.  
  6. public String getName(){return name;}
  7. public int getId(){ return id;}
  8. public int getAge(){return age;}
  9. public void setName(String name){this.name=name;}
  10. public void setId(int id){this.id=id;}
  11. public void setAge(int age){this.age = age;}
  12.  
  13. @Override
  14. public int compareTo(Person p) {
  15. if(age<p.getAge())
  16. return 1;
  17. else
  18. return -1;
  19. }
  20. }

你可以在重写的compareTo方法中实现更加复杂的比较,而返回的值决定其是升序还是降序,具体如下:

返回值 A>B A<B
return 1 升序   降序
return -1 降序 升序

此时实现一个Person的表

  1. List<Person> list = new ArrayList<>();
  2.  
  3. for(int i = 0; i<10; i++ ){
  4. Person person = new Person();
  5. person.setId(i);
  6. person.setName("person-"+i);
  7. person.setAge(i*5);
  8. list.add(person);
  9. }

调用Collections.sort结果为:降序

  1. [Name=hero-9,Id=9,Age=45], [Name=hero-8,Id=8,Age=40], [Name=hero-7,Id=7,Age=35], [Name=hero-6,Id=6,Age=30], [Name=hero-5,Id=5,Age=25], [Name=hero-4,Id=4,Age=20]

如果改变在Person中重写的compareTo的返回值,则结果为 升序

  1. [Name=hero-0,Id=0,Age=0], [Name=hero-1,Id=1,Age=5], [Name=hero-2,Id=2,Age=10], [Name=hero-3,Id=3,Age=15], [Name=hero-4,Id=4,Age=20], [Name=hero-5,Id=5,Age=25], [Name=hero-6,Id=6,Age=30]

2.Comparator

Comparator是比较器接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

我们可以直接创建一个比较器,然后来重写其比较方法:

  1. Comparator<Person> cp = new Comparator<Person>() {
  2. @Override
  3. public int compare(Person o1, Person o2) {
  4. return 0;
  5. }
  6. };

或者创建一个比较器类,实现Comparator接口,重写其中的方法,并在Collections.sort()中调用:

  1. public class PersonComparator implements Comparator<Person> {
  2. @Override
  3. public int compare(Person o1,Person o2) {
  4. return 0;
  5. }
  6. }

3.两者的区别

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

  Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

  两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

集合-Comparator和Comparable的更多相关文章

  1. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  2. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  3. Java集合排序方法comparable和comparator的总结

    一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...

  4. Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...

  5. Java自学-集合框架 Comparator和Comparable

    Java Comparator和Comparable 步骤 1 : Comparator 假设Hero有三个属性 name,hp,damage 一个集合中放存放10个Hero,通过Collection ...

  6. 【原】Comparator和Comparable的联系与区别

    1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...

  7. java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...

  8. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  9. Comparator与Comparable用法与区别

    一.概述.   Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...

随机推荐

  1. loadrunner迭代和并发的区别

    转载: ZEE的回答: 用比喻的方式来回一下: 四车道的马路,如果只有四辆车并排走过就是并发: 如果四辆车排成一纵队走过就是迭代: 如果有100辆车排成25行依次走过就是并发加迭代. 在以上说法中,只 ...

  2. 回顾servlet生命周期(代码测试),读取初始化参数

    servlet生命周期 为简洁,本例使用注解方式来测试,代码部分很简单,只需要新建一个serlet,继承自HttpServlet,重写init,doGet,doPost,destory方法即可,使用注 ...

  3. Django view(视图)

    在Django MTV模式中,View视图负责业务逻辑部分,路由系统接收到HTTP请求,并将任务分配给相应的视图函数,由视图函数来负责响应这个请求.无论视图本身包含什么逻辑,都要返回响应. 在这里HT ...

  4. 路由信息对象Route之属性query和params的区别

    query的使用 第一步:在<router-link/>标签中配置如下 <router-link :to="{name:'beijing',query:{id:1,user ...

  5. Python Revisited Day 07 (文件处理)

    目录 7.1 二进制数据的读与写 7.1.1 带可选压缩的Pickle 7.1.2 带可选压缩的原始二进制数据 7.2 文本文件的写入与分析 7.2.1 写入文本 7.2.2 分析文本 7.2.3 使 ...

  6. Java 向MySql 插入日期和时间正确的姿势

    Mysql和Java之间时间对应关系表: date              java.sql.Date Datetime        java.sql.Timestamp Timestamp    ...

  7. VS2010安装MVC4记录

    想学MVC4,但自己电脑上是VS2010,所以在网上查询怎样安装MVC4,总结下给大家. VS2010默认安装的是MVC2,安装MVC4必须先装 SP1,然后安装MVC4. VS2010 SP1 (1 ...

  8. mysql 解压版安装

    1.官网下载压缩包 2.解压 3.配置环境变量 添加系统环境变量  MYSQL_HOME 值为解压的主目录,例如     D:\mysql-5.7.25-winx64 修改Path 环境变量,点击编辑 ...

  9. 六、Java多人博客系统-2.0版本-代码实现

    1.前后端分离,后端使用spring boot,只负责提供数据,对外暴露Restful API.前端使用vue,只负责展示数据和向后台提交数据. 2.数据库使用mariadb,存储所有数据. 3.前端 ...

  10. android O 打开设置->声音->“点按时震动问题”

    主要原因是和导航栏和屏幕最下方3个按键的属性配置有关,因为在PhoneWindowManager中调用方法performHapticFeedbackLw(null, HapticFeedbackCon ...