十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程
参考: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(){ }排序的实现过程相关推荐
- 【LeetCode】two num 利用comparable接口 对对象进行排序
题目two num 题意:给定一个整数数组和一个目标值.要求在数组中找到两个数.使得它们的和相加等于目标值.而且返回两个数的下标 思路:1.假设使用暴力,时间复杂度为O(n^2) 2.能够先将全部数进 ...
- comparable接口,arrayList中对象排序
comparable接口,arrayList<>排序 https://blog.csdn.net/chunxiaqiudong5/article/details/52760058 1.要比 ...
- Java基础之Comparable接口和Comparator接口的比较
前言 就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那 ...
- Comparable接口和Comparator接口
目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...
- Java中的冒泡排序,Comparator接口和Comparable接口的简单使用
冒泡排序 冒泡排序是一种常见的排序方法,按照一定的规则(比如从小到大或者从大到小的顺序)对一组数据进行排序.而在Java开发中,也经常用到冒泡排序.我们就以下面的一个例子来讲解冒泡排序算法. 给定一个 ...
- Java中的Comparable接口和Comparator接口
介绍 Comparable<T>接口和Comparator<T>接口都是JDK中提供的和比较相关的接口.使用它们可以对对象进行比较大小,排序等操作.这算是之后排序的先导知识吧. ...
- 简介------Comparable接口介绍及冒泡排序
简单排序 在程序中,排序是常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则排序. 在java的开发工具包jdk中,已经给我们提供了很多数据结构与算法的实现,比如List,Set,Map, ...
- java arraylist comparable_Java 两种ArrayList集合自定义对象属性排序,Comparator接口 或 Comparable接口...
1,Comparator接口 -- 重写Comparator public class User { private String id; private String name; public Us ...
- Collections接口下的Comparetor类和Comparable接口排序
继承Comparable接口,重写compareTo方法进行排序: public class Student implements Comparable<Student>{ pri ...
最新文章
- Liferay研究-smilingleo
- Qt Qwdget 汽车仪表知识点拆解4 另类进度条实现
- 如何让context attribute不出现在configuration界面的available fields列表内
- linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)
- 【算法】希尔排序 推导方法
- 4复数与复变函数(四)
- Uniapp进行APP打包——iOS 系统
- pwn题shellcode收集
- 用Python能下载抖音无水印视频?免费教程来了!
- 9个超绚丽的HTML5 3D图片动画特效
- 央行:个人征信基本实现金融信用信息广覆盖
- 程序员博客html模板,程序员技术博客WordPress主题
- 爬虫基础之动态网页数据抓取(下)
- TSX 在Vue项目的使用
- Matlab 统计不同元素个数
- 正则表达式 第一次碰到某个特定字符就返回
- 将图片转化为数据储存
- SpringBoot基于若依项目工时统计成本核算管理源码带文字教程
- form 9i, 6i 运行环境配置
- D - Squirrel and chestnut(二分)