Java中比较器Comparator和Comparable的区别
一、背景
我们在使用 Collections.sort()
对链表进行排序(或者使用 Arrays.sort()
对数组进行排序)时,常常需要根据不同情况自定义排序规则。
比如:当我们存储学生对象时,我们需要按照学生年龄进行排序,这时我们就可以通过比较器 Comparator 或者 Comparable 对排序顺序进行控制。
本文将结合示例对 Comparator 和 Comparable 两种比较器的使用进行介绍
二、Comparable
Comparable 是一个接口,其本质上是一个内比较器(在类内部)。
需要定义排序/比较规则的类实现 Comparable 接口,并且重写 compareTo(Object o)
方法,从而自定义比较规则。
public interface Comparable<T>
Comparable 代码示例 :
下面的代码为 Student
类重写了 compareTo
方法,实现了 Student 对象按照 age 大小进行比较
public class Student implements Comparable<Object> { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } 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; } @Override public String toString() { return "{" + this.getName() + "," + this.getAge() + "}"; } // 通过重写 compareTo 方法,实现比较器 @Override public int compareTo(Object o) { Student student = (Student) o; return this.age - student.getAge(); } public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("wanqing", 21)); list.add(new Student("xinyu", 23)); list.add(new Student("huahua", 1)); Collections.sort(list); System.out.println(list); } }
可以观察到输出结果按照 age 升序进行了排序 ——
三、Comparator
Comparator
是一个外比较器,其使用场景为当一个类未实现 Comparable 方法,或者实现的 Comparable 方法的比较规则不是我们现在想用的(比如我们想按照降序的方式排序),我们就可以通过为 sort()
方法传入 Comparator
的形式,自定义排序规则。
其使用方式如下:
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
Comparator
重写 compare
方法,方法内部重写比较规则
Comparator 代码示例
下面代码通过传入 Comparator比较器 的方式,实现了对 list 按照学生年龄降序排序
public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("wanqing", 21)); list.add(new Student("xinyu", 23)); list.add(new Student("huahua", 1)); // 实现对 list 按照学生年龄降序排序 Collections.sort(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // 降序排序 return o2.getAge() - o1.getAge(); } }); System.out.println(list); }
可以观察到输出结果按照 age 进行了降序排序 ——
到此这篇关于Java中比较器Comparator和Comparable的区别的文章就介绍到这了,更多相关Java的Comparator和Comparable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springBoot项目中使用@Value取值出现的问题及解决
这篇文章主要介绍了springBoot项目中使用@Value取值出现的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-07-07简单操作实现Java jsp servlet文件上传过程解析
这篇文章主要介绍了简单操作实现Java jsp servlet文件上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-10-10解决IDEA启动springboot项目报错java.lang.ClassNotFoundException: jav
这篇文章主要介绍了解决IDEA启动springboot项目报错java.lang.ClassNotFoundException: javax.servlet.ServletContext问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01Spring/SpringBoot @RequestParam注解无法读取application/json格式数据问题
RequestParam用于将指定的请求参数赋值给方法中的形参,可以接受简单类型属性,也可以接受对象类型,一般用于GET请求,下面这篇文章主要给大家介绍了关于Spring/SpringBoot @RequestParam注解无法读取application/json格式数据问题解决的相关资料,需要的朋友可以参考下2022-10-10
最新评论