Comparable比较器和Comparator比较器
1、Comparable比较器
在Arrays类中存在sort()排序方法,此方法可以直接对对象数组进行排序。
public static void sort(Object[] a
根据元素的自然顺序对指定对象数组按升序进行排序。但前提是数组中的所有元素都必须实现 Comparable 接口,并覆写compareTo()方法指定对象排序的规则。
Comparable接口定义于java.lang包中:public interface Comparable<T>;int compareTo(T t)方法比较此对象与指定对象的顺序。
现在新建一个Student类,实现按照成绩的由高到低排序:
import java.util.Arrays;
class Student implements Comparable<Student> { //指定比较的类型也是Student
private String name;
private float score;
public Student(String name,float score){
this.name = name;
this.score = score;
}
public String toString(){
return "姓名: " + this.name + "\t"+"成绩: "+this.score;
}
@Override
public int compareTo(Student o) {
if(this.score>o.score)
return 1;
if(this.score<o.score)
return -1;
return 0;
}
}
public class TestComparable {
public static void main(String args[]){
Student stus[] = {new Student("夏小宝",99.0f),
new Student("李花花",100.0f),new Student("陆小凤",90.0f),
new Student("李寻欢",88.5f)};
Arrays.sort(stus);
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i]);
}
}
}

若是Student类没有实现Comparable接口,则在使用Arrays.sort()方法时程序会出现 java.lang.ClassCastException异常。
2、Comparator比较器
如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定无法进行对象排序操作,所以为了解决这样的问题,Java又定义了另一个比较器的操作接口--Comparator接口。
public interface Comparator<T>
int compare(T o1, T o2) //比较用来排序的两个参数
boolean equals(Object obj) //指示某个其他对象是否“等于”此 Comparator
新建一个学生类,要求按照成绩的由高到低进行排序。但在这个学生类中我们按照常规的定义,只是在其中覆写了Object类中的equals方法,不再实现Comparable接口。
class Student{
private String name;
private float score;
public Student(String name,float score){
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String toString(){
return "姓名: " + this.name + "\t"+"成绩: "+this.score;
}
public boolean equals(Object o){ //覆写Object类中的equals方法
if(this == o){
return true;
}
if(!(o instanceof Student)){
return false;
}
Student stu = (Student)o; //对Object类向下转型
if(this.name.equals(stu.name)&&this.score == stu.score){
return true;
}else{
return false;
}
}
}
当然这样的类是不能进行对象排序的,为了让此类可以进行排序操作,所以需要单独为此类定义一个比较器,此比较器实现Comparator接口。应该注意的是这时调用sort方法时应该调用他的重载方法:
public static <T> void sort(T[] a,
Comparator<? super T> c)
import java.util.Arrays;
import java.util.Comparator; class StudentComparator implements Comparator<Student>{ //实现Comparator接口,指定比较类型为Student
//Comparator接口存在compare和equals两个方法,但StudentComparator类中已经从Object类中继承了equals方法,不需要在覆写
@Override
public int compare(Student arg0, Student arg1) {
if(arg0.getScore() == arg1.getScore()){
return 0;
}
if(arg0.getScore() > arg1.getScore()){
return 1;
}else{
return -1;
}
}
} public class TestComparator {
public static void main(String args[]){
Student stus[] = {new Student("夏小宝",99.0f),
new Student("李花花",100.0f),new Student("陆小凤",90.0f),
new Student("李寻欢",88.5f)};
Arrays.sort(stus,new StudentComparator());
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i]);
}
}
}

可以看到,Comparable比较器是在需要比较的类在定义时就要实现。而如果一个类已经定义好,但我们又不想修改类的定义或修改起来比较麻烦,我们就为此类单独定义一个比较器,这个比较器实现Comparator接口。这是这两个接口的区别。
Comparable比较器和Comparator比较器的更多相关文章
- Java 之 比较器( Comparator接口与 Comparable 接口)
一.定制排序:java.util.Comparator 接口 强行对某个对象 collection 进行整体排序 的比较函数.可以将 Comparator 传递给 sort 方法(如 Collecti ...
- java.util下有一个Comparator(比较器)
java.util下有一个Comparator(比较器) 它拥有compare(),用来比较两个方法. 要生成比较器,则用Sort中Sort(List,List(Compate)) 第二种方法更灵活, ...
- Comparator比较器
Comparator比较器 简介 为什么写? comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用 大多数文章告诉大家comparator ...
- 菜鸡的Java笔记 comparator 比较器
1.数组操作类: Arrays 2.两种比较器的使用: Comparable Comparator 3.实现二叉树算法 content (内容) ...
- Java TreeSet集合 比较器排序Comparator的使用
比较器排序Comparator的使用 存储学生对象,并遍历,创建TreeSet集合使用带参构造方法 要求,按照学生年龄从小到大排序,如果年龄相同,则按照姓名的字母循序排序 结论 用TreeSet集合存 ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Comparable<T> 和 Comparator<T>
相同点: Comparable<T> 和 Comparator<T>都是接口 不同点: 两者声明的方法不同.前者是compareTo()方法,后者是compare()方法. C ...
- Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...
随机推荐
- T-sql GroupBy语句常见问题处理
1.问题描述 现在有一张course表(含课程编号和名称)和一张sc表(含学生学号,选修课程的编号以及考试成绩),如下:现在想要查询所有课程编号.对应的课程名称以及选修该课程的所有学生的平均成绩.一开 ...
- [C++] Lvalue and Rvalue Reference
Lvalue and Rvalue Reference int a = 10;// a is in stack int& ra = a; // 左值引用 int* && pa ...
- p1501 [国家集训队]Tree II
传送门 分析 lct板子题 单独维护一下加和乘的情况即可 维护方法和维护翻转差不多 代码 #include<iostream> #include<cstdio> #includ ...
- Django调试工具django-debug-toolbar安装使用教程
在网站开发中难免要调试页面,而使用django开发站点时,可以使用django-debug-toolbar来进行调试,安装这个插件很有用,我一开始是为了查看某个页面中所有的context变量值,当然你 ...
- UID, EUID, SUID, FSUID
摘自:https://blog.csdn.net/wh8_2011/article/details/50825340 UID, EUID, SUID, FSUID 2016年03月08日 10:40: ...
- java grpc实例分析
一.Protocol Buffer 我们还是先给出一个在实际开发中经常会遇到的系统场景.比如:我们的客户端程序是使用Java开发的,可能运行自不同的平台,如:Linux.Windows或者是Andro ...
- 了解entity framework其他query方式之Entity SQL,Raw Sql分析
一:linq 对ef来说不是唯一性的query... 二:Entity Sql 1. esql => entity sql... [类sql的语言] 和sql差不多,但是呢,不是sql... u ...
- Arduino I2C + 温湿度传感器HTS221
主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频 ...
- C# 数字转换成汉字大写 数值转换成汉字大写
1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...
- 【转】基于Redis实现延时队列服务
背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单 ...