Comparator 和 Comparable的使用及区别
这里写目录标题
- Comparable的使用
- Comparator比较器
- Comparator和Comparable的区别
Comparable的使用
1.1、我们创建一个Student(学生)类
class Student {public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}
}
1.2、我们来进行测试
public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);//Exception in thread "main" java.lang.ClassCastException: Student cannot be cast to java.lang.ComparableSystem.out.println(Arrays.toString(students));}
}
此时会发生运行时异常:
java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
这个意思就是类型转换异常。
因为自定义类型不能转换为sort原来方法中排序的类型,所以我们需要写一个比较器。
1.3、Class Student实现Comparable接口
class Student implements Comparable<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}//通过年龄比较@Overridepublic int compareTo(Student o) {return this.age - o.age;}
}
this.age - o.age 表示当前age-传入的age,结果是升序;
如果是o.age - this.age 那么表示的是降序;
1.4我们再来测试
public class Test {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);System.out.println(Arrays.toString(students));
//[{age=22, name='LeeSin}, {age=24, name='Timor}, {age=26, name='Ashy}]}
}
结果是[{age=22, name='LeeSin}, {age=24, name='Timor}, {age=26, name='Ashy}],我们发现数组通过年龄升序排序
1.5、同样的,我们也可以通过姓名首字母来比较
import java.util.Arrays;public class Test {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);System.out.println(Arrays.toString(students));//[{age=26, name='Ashy}, {age=22, name='LeeSin}, {age=24, name='Timor}]}
}
class Student implements Comparable<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}/*@Overridepublic int compareTo(Student o) {return this.age - o.age;}*/
}
结果是[{age=26, name='Ashy}, {age=22, name='LeeSin}, {age=24, name='Timor}],我们发现数组是以name首字母来排序的。
Comparator比较器
1.1我们继续使用上面的Student(学生)类
import java.util.Arrays;
import java.util.Comparator;public class ComparatorDemo {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");//根据首字母排序NameComparator nameComparator = new NameComparator();Arrays.sort(students,nameComparator);System.out.println(Arrays.toString(students));
//[{姓名=Ashy,年龄=26 }, {姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }]//根据年龄排序AgeComparator ageComparator = new AgeComparator();Arrays.sort(students,ageComparator);System.out.println(Arrays.toString(students));
//[{姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }, {姓名=Ashy,年龄=26 }]}
}class Student {public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "姓名=" + name + ",年龄=" + age + " " + "}";}}class AgeComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}class NameComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
}
结果分别是是:
[{姓名=Ashy,年龄=26 }, {姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }]
[{姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }, {姓名=Ashy,年龄=26 }]
Comparator和Comparable的区别
细心的同学会发现我们使用Comparable接口用name首字母比较时,
先屏蔽了重写的age比较方法。
@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}/*@Overridepublic int compareTo(Student o) {return this.age - o.age;}*/
因为一个类里面重写的compareTo方法只有一个,当我们选择用name首字母比较后,就不能用age大小来比较,这就是Comparable的局限性,一旦写死,只能用一种方法比较。但是我们使用Comparator比较器的时候,既可以用name比较,也可以用age比较。
当然,Comparator也可以像Comparable一样用来实现:
class Student implements Comparator<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "姓名=" + name + ",年龄=" + age + " " + "}";}@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}
效果是一样的。
还有一点就是Comparable重写的是compareTo方法;
来看下Comparable源码:
public int compareTo(T o);
只有一个需要重写的方法。
而Comparator重写的是compare方法,但是它却又很多方法。
老规矩,小白入门,如有错误,请多多包含指正。
谢谢!
另外,我另外一篇博客写了< > == 和equals的使用,链接如下,欢迎来访!!!
java中的比较== < > Comparator和 Comparable
还有一篇刷题中使用比较器的博客
字符统计与查找 和 最小的 k 最数字(Comparator 比较器实战应用)
Comparator 和 Comparable的使用及区别相关推荐
- Java中Comparator和Comparable之间的区别
常见的面试问题之一是"比较器和可比较器之间有什么区别". 或"您将如何通过其ID或名称对员工对象集合进行排序".为此,我们可以使用两个接口,即Comparato ...
- Comparator和Comparable的区别
一.概述 Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较.排序,Comparator位于包java.util下,而Comparable位于包java.l ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- Comparator和Comparable (转)
Comparator和Comparable比较 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Compa ...
- Java核心技术之Comparator和Comparable在排序中的应用
自定义的类User: package com.example.testcomparator;public class User{private String name;private int age; ...
- compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别
前言: 在实际开发中,经常需要对某些数据进行比较,例如我们在网购的时候,检索某件商品,它会按照价格,收藏等等关键词展示出来,当中的展示规则便是对商品间的某个相同数据比较后所得出来的. 在Java中,数 ...
- Comparator和Comparable、compare的使用
比较器排序Comparator和Comparable的使用 简述Comparable和Comparator两个接口的区别. compare是comparator里面的一个方法 Comparable:强 ...
- Comparator 和 Comparable
Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...
- 集合框架-Comparator和Comparable的区别
Comparator也叫外部比较器,常在使用Collections工具类进行集合排序的时候使用.外部比较器Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者比较的功能不能满 ...
最新文章
- 计算机组成知识试题及答案,《计算机组成与结构复习题及答案.doc
- php动态交叉表,PHP Array交叉表实现代码
- 如何在JavaScript中声明名称空间?
- “CAIL 2021中国法律智能技术评测”第二赛段已全面开启!
- linux 信号量_SystemV IPC通信信号量
- 廖雪峰Git教程学习总结
- 施努卡:3d视觉检测方案 3d视觉检测应用行业
- 四LED单端输出充电仓配合TWS耳机芯片QCC3020使用
- phalapi init.php,PhalApi:[1.12] 参数规则:接口参数规则配置
- 关于浮动元素,你还在自己计算位置吗?来看看 Floating UI 吧
- Spring IOC(一):概述
- 金融数据分析与挖掘具体实现方法 -1
- Windows Defender 防病毒发现威胁;关闭;
- 调用ArcToolBox里的Tool的三种方法
- php支持链式操作,PHP三种方式实现链式操作-php教程
- 神经网络模型通用性分析,神经网络模型可解释性
- 视频安全之授权播放和防录屏跑马灯
- java代码实现在Windows中自动连接WiFi(乞丐版)
- 项目管理论坛_【项目管理论坛】第21期:如何做一名优秀的项目经理
- Java实现连连看源代码文档_JAVA实现连连看游戏