参考:https://www.cnblogs.com/igoodful/p/9517784.html


Collections有两种比较规则方式,第一种是使用自身的比较规则:

该类必须实现Comparable接口并重写comparTo方法。

this可以想象为1,传入对象o想象为2,返回1-2即按升序排序。返回2-1即按降序排序。

1、首先编写一个实现Comparable接口的实体类

 1 package com.abc;
 2 //Comparable接口后面一定要加上需要比较的数据类型
 3 public class Person implements Comparable<Person>{
 4
 5     private String name;
 6     private int age;
 7     private int salary;
 8
 9     public Person() {
10     }
11
12     public Person(String name, int age, int salary) {
13         this.name = name;
14         this.age = age;
15         this.salary = salary;
16     }
17
18     public String getName() {
19         return name;
20     }
21
22     public void setName(String name) {
23         this.name = name;
24     }
25
26     public int getAge() {
27         return age;
28     }
29
30     public void setAge(int age) {
31         this.age = age;
32     }
33
34     public int getSalary() {
35         return salary;
36     }
37
38     public void setSalary(int salary) {
39         this.salary = salary;
40     }
41
42     @Override
43     public String toString() {
44         return "Person{" +
45                 "name='" + name + '\'' +
46                 ", age=" + age +
47                 ", salary=" + salary +
48                 '}';
49     }
50
51     //自身定义年龄升序
52     @Override
53     public int compareTo(Person o) {
54         return this.age-o.age;
55     }
56 }

2、编写测试代码

package com.abc;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);Collections.sort(people);System.out.println(people);}
}

3、运行结果

[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}]//完成了年龄的升序排列
[Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]


第二个参数为比较器,可以使用它来定义针对集合排序时的比较元素大小的规则。

使用这种方式时,sort方法不要求集合元素必须实现Comparable接口了,因为不会使用元素自身的比较规则

1、编写一个普通的实体类,不需要实现任何接口

package com.abcd;public class Person{private String name;private int age;private int salary;public Person() {}public Person(String name, int age, int salary) {this.name = name;this.age = age;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}}

2、编写测试代码

package com.abcd;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);     //排序规则 salary降序Collections.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o2.getSalary()- o1.getSalary();}});System.out.println(people);}
}

3、运行结果

[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}]
[Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]

  

总结

总结一下,两种比较器Comparable和Comparator,后者相比前者有如下优点:

1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法

2、实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修 改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后面会写到就是一种典型的策略模式

当然,这不是鼓励用Comparator,意思是开发者还是要在具体场景下选择最合适的那种比较器而已。

转载于:https://www.cnblogs.com/mason117/p/10646382.html

十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程相关推荐

  1. 【LeetCode】two num 利用comparable接口 对对象进行排序

    题目two num 题意:给定一个整数数组和一个目标值.要求在数组中找到两个数.使得它们的和相加等于目标值.而且返回两个数的下标 思路:1.假设使用暴力,时间复杂度为O(n^2) 2.能够先将全部数进 ...

  2. comparable接口,arrayList中对象排序

    comparable接口,arrayList<>排序 https://blog.csdn.net/chunxiaqiudong5/article/details/52760058 1.要比 ...

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

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

  4. Comparable接口和Comparator接口

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

  5. Java中的冒泡排序,Comparator接口和Comparable接口的简单使用

    冒泡排序 冒泡排序是一种常见的排序方法,按照一定的规则(比如从小到大或者从大到小的顺序)对一组数据进行排序.而在Java开发中,也经常用到冒泡排序.我们就以下面的一个例子来讲解冒泡排序算法. 给定一个 ...

  6. Java中的Comparable接口和Comparator接口

    介绍 Comparable<T>接口和Comparator<T>接口都是JDK中提供的和比较相关的接口.使用它们可以对对象进行比较大小,排序等操作.这算是之后排序的先导知识吧. ...

  7. 简介------Comparable接口介绍及冒泡排序

    简单排序 在程序中,排序是常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则排序. 在java的开发工具包jdk中,已经给我们提供了很多数据结构与算法的实现,比如List,Set,Map, ...

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

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

  9. Collections接口下的Comparetor类和Comparable接口排序

    继承Comparable接口,重写compareTo方法进行排序: public class Student implements Comparable<Student>{     pri ...

最新文章

  1. Liferay研究-smilingleo
  2. Qt Qwdget 汽车仪表知识点拆解4 另类进度条实现
  3. 如何让context attribute不出现在configuration界面的available fields列表内
  4. linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)
  5. 【算法】希尔排序 推导方法
  6. 4复数与复变函数(四)
  7. Uniapp进行APP打包——iOS 系统
  8. pwn题shellcode收集
  9. 用Python能下载抖音无水印视频?免费教程来了!
  10. 9个超绚丽的HTML5 3D图片动画特效
  11. 央行:个人征信基本实现金融信用信息广覆盖
  12. 程序员博客html模板,程序员技术博客WordPress主题
  13. 爬虫基础之动态网页数据抓取(下)
  14. TSX 在Vue项目的使用
  15. Matlab 统计不同元素个数
  16. 正则表达式 第一次碰到某个特定字符就返回
  17. 将图片转化为数据储存
  18. SpringBoot基于若依项目工时统计成本核算管理源码带文字教程
  19. form 9i, 6i 运行环境配置
  20. D - Squirrel and chestnut(二分)

热门文章

  1. Spark SQL 编程API入门系列之SparkSQL数据源
  2. linux教程:配置Tomcat开机启动
  3. NSURLRequest详解IOS最基础的api
  4. 进程间通信之消息队列
  5. 数据结构排序法之插入法
  6. vue-i18n使用及踩坑记录
  7. Oracle监听器—静态注册
  8. asp.NET自定义服务器控件内部细节系列教程一
  9. 设计模式常见面试真题详解
  10. 数据流图 系统流程图 程序流程图 系统结构图联系与区别