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比较器的更多相关文章

  1. Java 之 比较器( Comparator接口与 Comparable 接口)

    一.定制排序:java.util.Comparator 接口 强行对某个对象 collection 进行整体排序 的比较函数.可以将 Comparator 传递给 sort 方法(如 Collecti ...

  2. java.util下有一个Comparator(比较器)

    java.util下有一个Comparator(比较器) 它拥有compare(),用来比较两个方法. 要生成比较器,则用Sort中Sort(List,List(Compate)) 第二种方法更灵活, ...

  3. Comparator比较器

    Comparator比较器 简介 为什么写? comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用 大多数文章告诉大家comparator ...

  4. 菜鸡的Java笔记 comparator 比较器

    1.数组操作类: Arrays        2.两种比较器的使用: Comparable Comparator        3.实现二叉树算法            content (内容)   ...

  5. Java TreeSet集合 比较器排序Comparator的使用

    比较器排序Comparator的使用 存储学生对象,并遍历,创建TreeSet集合使用带参构造方法 要求,按照学生年龄从小到大排序,如果年龄相同,则按照姓名的字母循序排序 结论 用TreeSet集合存 ...

  6. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  7. Java:实现对象的比较 comparable接口和comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

  8. Comparable<T> 和 Comparator<T>

    相同点: Comparable<T> 和 Comparator<T>都是接口 不同点: 两者声明的方法不同.前者是compareTo()方法,后者是compare()方法. C ...

  9. Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

    Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...

随机推荐

  1. Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...

  2. List 组件简单示例及其onItemsDisclosure点击事件

    来自<sencha touch权威指南>第9章,276页开始 ------------------------------------------------- app.js代码如下: E ...

  3. Spring.net 表达式解析ExpressionEvaluator

    1.类定义 public class Company { private string name; private Employee managingDirector; public string N ...

  4. scp 的时候提示WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    摘自:https://blog.csdn.net/haokele/article/details/72824847   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  5. 无废话 Thrift 之 Hello World( PHP 版).

    Thrift 不再介绍.体验一把 PHP 的Server , PHP 的Client. 0.安装,装备环境,不表,运行 thrift -version 看到版本就行. 1.写 HelloThrift. ...

  6. 使用Selenium&PhantomJS的方式爬取代理

    前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...

  7. SQL日期跟时间值序列

    与数据操作相关的场景要生成日期和时间序列,序列的范围是从输入值@start到@end,且具有一定的时间间隔.这样的场景包括填充数据仓库中的时间维度.应用程序的运行时间安排以及其他.可以借助http:/ ...

  8. 编写高质量代码改善C#程序的157个建议——建议156:利用特性为应用程序提供多个版本

    建议156:利用特性为应用程序提供多个版本 基于如下理由,需要为应用程序提供多个版本: 应用程序有体验版和完整功能版. 应用程序在迭代过程中需要屏蔽一些不成熟的功能. 假设我们的应用程序共有两类功能: ...

  9. 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground

    建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...

  10. ACM 媛在努力 华山论剑

    媛在努力 描述在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次 ...