最近在学习贪心算法和动态规划的过程中,里面有一段自然排序的操作,顺便简单了解一下Java中对象比较后排序要使用的两个接口:Comparable和Comparator。如果是数字,直接比较就行,但是如果是对象,如何比较后排序呢?就需要用到这两个接口了,并且将自己定义的类作为参数传入接口泛型,在接口里重写比较方法,将自己要选择排序的类属性添加到比较条件中去。

接口主要区别

(1)Comparable接口是在java.lang下,Comparator接口是在java.util下。

(2)如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。

(3)实现Comparable接口的类必须是自然排序,另外一个不是强制条件。

使用Comparable

(1)定义实现类时,实现Comparable接口。

1 /**

2 * 实体类,实现Comparable接口3 */

4 public class Person implements Comparable{5

6 //属性

7 privateString name;8 private intage;9 private intsalary;10

11 //get和set方法

12 publicString getName() {13 returnname;14 }15

16 public voidsetName(String name) {17 this.name =name;18 }19

20 public intgetAge() {21 returnage;22 }23

24 public void setAge(intage) {25 this.age =age;26 }27

28 public intgetSalary() {29 returnsalary;30 }31

32 public void setSalary(intsalary) {33 this.salary =salary;34 }35

36 //构造方法

37 public Person(String name, int age, intsalary) {38 this.name =name;39 this.age =age;40 this.salary =salary;41 }42

43 @Override44 publicString toString() {45 return "Person{" +

46 "name='" + name + '\'' +

47 ", age=" + age +

48 ", salary=" + salary +

49 '}';50 }51

52 //重写接口方法,o为要比较的对象

53 @Override54 public intcompareTo(Person o) {55 //大于要比较的对象就返回1

56 if(this.salary>o.getSalary()){57 return 1;58 }59 //小于则返回-1

60 else if(this.salary

64 return 0;65 }66 }

(2)测试类,来查看是否按照自定义的属性进行自然排序。

1 importjava.util.ArrayList;2 importjava.util.Collections;3 importjava.util.List;4

5 public classTestComparable {6

7 public static voidmain(String[] args) {8 //测试Comparable接口

9 Person p1=new Person("clyang",18,4000);10 Person p2=new Person("messi",30,8000);11 Person p3=new Person("ronald",32,9000);12 Person p4=new Person("herry",19,7600);13 Person p5=new Person("roben",35,7900);14

15 //添加到集合

16 List list=new ArrayList<>();17 list.add(p1);18 list.add(p2);19 list.add(p3);20 list.add(p4);21 list.add(p5);22

23 System.out.println("-----------------排序前-----------------");24 for(Person person : list) {25 System.out.println(person);26 }27

28 //排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比较的元素进行自然排序,即从小到大

29 Collections.sort(list);30

31 System.out.println("-----------------排序后-----------------");32 for(Person person : list) {33 System.out.println(person);34 }35

36 }37 }

控制台输出情况,发现正常的按照工资进行了自然排序,即升序排列。

使用Comparator

使用这个接口时,创建类的时候可以不实现接口,需要单独创建一个类来实现这个接口。

(1)创建类

1 /**

2 * 实体类,不实现Comparable接口,使用单独的Comparator接口3 */

4 public classStaff {5

6 //属性

7 privateString name;8 private intage;9 private intsalary;10

11 public Staff(String name, int age, intsalary) {12 this.name =name;13 this.age =age;14 this.salary =salary;15 }16

17 publicString getName() {18 returnname;19 }20

21 public voidsetName(String name) {22 this.name =name;23 }24

25 public intgetAge() {26 returnage;27 }28

29 public void setAge(intage) {30 this.age =age;31 }32

33 public intgetSalary() {34 returnsalary;35 }36

37 public void setSalary(intsalary) {38 this.salary =salary;39 }40

41 @Override42 publicString toString() {43 return "Staff{" +

44 "name='" + name + '\'' +

45 ", age=" + age +

46 ", salary=" + salary +

47 '}';48 }49 }

View Code

(2)创建实现接口的类,重写里面的比较方法,这属于泛型在接口中的一种使用方法,即接口泛型是什么,实现类里面就是什么泛型。

1 importjava.util.Comparator;2

3 /**

4 * 单独写的比较器,实现Compartor接口5 */

6 public class StaffComparator implements Comparator{7

8 //不一定要自然排序即升序,可以反过来写成降序

9 @Override10 public intcompare(Staff o1, Staff o2) {11 //降序

12 /*if(o1.getSalary()>o2.getSalary()){13 return -1;14 }15 if(o1.getSalary()

19

20 //升序

21 /*if(o1.getSalary()>o2.getSalary()){22 return 1;23 }24 if(o1.getSalary()

28

29 //先按照年龄倒序排,如果年龄相等比较工资

30 if(o1.getAge()>o2.getAge()){31 return -1;32 }33 if(o1.getAge()

37 if(o1.getSalary()>o2.getSalary()){38 return 1;39 }40 if(o1.getSalary()

测试类,来查看是否按照自己的要求来排序。

1 importjava.util.ArrayList;2 importjava.util.Collections;3 importjava.util.Comparator;4 importjava.util.List;5

6 public classTestComparator {7

8 public static voidmain(String[] args) {9 //测试Comparator接口

10 Staff p1=new Staff("clyang",18,4000);11 Staff p2=new Staff("messi",30,8000);12 Staff p3=new Staff("ronald",32,9000);13 Staff p4=new Staff("herry",18,7600);14 Staff p5=new Staff("roben",35,7900);15

16 //添加到集合

17 List list=new ArrayList<>();18 list.add(p1);19 list.add(p2);20 list.add(p3);21 list.add(p4);22 list.add(p5);23

24 System.out.println("-----------------排序前-----------------");25 for(Staff staff : list) {26 System.out.println(staff);27 }28

29 //排序,需要使用自定义比较类

30 Comparator myComparator=newStaffComparator();31 Collections.sort(list,myComparator);32

33 System.out.println("-----------------排序后-----------------");34 for(Staff staff : list) {35 System.out.println(staff);36 }37 }38 }

控制台输出情况,可以发现,先是按照年龄进行了倒排序,当排到clyang和herry的时候,由于年龄相同,因此继续按照工资来升排序。

以上是两种接口的使用方法,也是参考了博主的文章学习的,以后可以拿来用。

参考博文:

java compareable接口_Java对象比较-Comparable和Comparator接口使用相关推荐

  1. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  2. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  3. 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序

    1.实现对象数组排序 (1)方法一,需要排序的对象所属的类实现Comparable接口,复写 comparaTo方法  (2)方法二,需要排序的对象所属的类已经完成无法实现Comparable接口,这 ...

  4. Comparable和Comparator接口

    目录 Comparable接口 Comparator接口(比较器) Comparable接口和Comparator的比较 总结 Comparable接口 作用:实现对引用数据类型的比较和排序 使用:待 ...

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

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

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

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010859650/article/details/85009595 Comparable 简介 Comparable 是排序 ...

  7. 【Java】Comparable和Comparator接口

    活动地址:CSDN21天学习挑战赛 ✨博客主页: XIN-XIANG荣 ✨系列专栏:[Java SE] ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录 一. Comparable接口 1. C ...

  8. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  9. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

最新文章

  1. 剑指offer55 字符流中第一个不重复的字符(最典型错误)
  2. Python基础学习四 函数
  3. 通过百度 vs 奇虎,来谈博客搜索
  4. 爬虫入门学习:爬取股票论坛信息
  5. 博客美化中遇到的问题汇总
  6. clion如何创建c项目_使用CMake和Clion构建C项目 (Structuring C Project with CMake and Clion)...
  7. 文件上传到服务器文件名中文乱码问题
  8. UIScrollView, 滚动视图
  9. 安卓输入法 车机版_触宝输入法HD
  10. 完美数的算法设计(C语言)
  11. java读取pdf多表格_怎么用java读取pdf中的表格
  12. RadSegNet: 一个稳定的雷达摄像头融合方法(2022最新)
  13. 《密码编码学与网络安全》William Stalling著---学习笔记(一)【知识点速过】【传统密码+经典对称加密算法+经典公钥密码算法+密码学Hash函数】
  14. PIL库改变图片大小
  15. 深入浅出聊机器学习西瓜书
  16. 头插法和尾插法总结(动图版)
  17. 组建项目团队-执行过程组
  18. 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(流水账)
  19. 后台传给前台的进度条传百分比数据
  20. 堆糖瀑布流完整解决方案(jQuery)

热门文章

  1. jvm 垃圾收集算法_JVM垃圾收集和优化
  2. 如何判断2服务器性能好或坏_无服务器革命:好,坏和丑
  3. storm apache_Apache Storm的实时情绪分析示例
  4. java转换为c#_将25k行C#转换为Java的经验教训
  5. maven junit测试_使用Maven Failsafe和JUnit @Category将集成测试与单元测试分开
  6. Spring ClassPathXmlApplicationContext
  7. mapreduce 算法_MapReduce算法–了解数据联接第二部分
  8. adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列
  9. Java 11功能– Java飞行记录器
  10. 26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史