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 ...
随机推荐
- rpm管理
系统上rpm命令管理程序包: 安装.卸载.升级.查询.校验.数据库维护 安装: rpm {-i|--install} [install-options] PACKAGE_FILE ... -v: ve ...
- vmware workstation 12 密钥
VMware Workstation 12序列号:5A02H-AU243-TZJ49-GTC7K-3C61N
- PBOC中文件结构,文件类型解析
1.明确两个规范,a. ISO7816 b.EMV规范/PBOC规范,二者的区别,7816是ISO制定的,是国际规范,而EMV规范是卡组织制定的,是遵循ISO7816规范的,PBOC是抄袭EMV规 ...
- IDEA设置与快捷键记录
一:代码提示大小写设置 二:设置代码检查等级 IntelliJ IDEA 对于编辑大文件并没有太大优势,很卡,原因就是它有各种检查,这样是非常耗内存和 CPU 的,所以为了能加快大文件的读写,我一般会 ...
- [GO]从键盘获取回复的客户端
package main import ( "net" "fmt" "os" ) func main() { //连接服务器 conn, e ...
- 【转】Java虚拟机详解----常用JVM配置参数
原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html 本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: ...
- C#延迟执行
借鉴于该篇博客:http://kb.cnblogs.com/page/42581/ 先看两个方法 public class YieldClasses { public static IEnumerab ...
- Alpha冲刺(八)
Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 进一步优化代码,结合自己负责的部分修 ...
- CodeForces 408E Curious Array(组合数学+差分)
You've got an array consisting of n integers: a[1], a[2], ..., a[n]. Moreover, there are m queries, ...
- 金牌选手zzy的卡常头文件
一定要粘上去啊,亲测快两倍 #pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelet ...