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 ...
随机推荐
- redis缓存分页思路
传统分页一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点.如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了.比如像微博这样的场景,微博下面现在有一个顶次数的排 ...
- 三个参数,对mysql存储限制的影响
1.max_allowed_packet 这个参数会影响单此插入或读取的包的大小,一般和blob字段共用,但要注意一点是这个参数好像是分服务端与客户端的,如果想输出大字段的内容,则在用客户端链接服务 ...
- [Training Video - 3] [Groovy in Detail] Non-static and Static functions, initializing log inside class
log.info "starting" // we use class to create objects of a class Planet p1 = new Planet() ...
- spring.net 继承
. <object id="parent" type="Bll.Parent, HRABLL" > <property name=" ...
- web桌面
http://www.pengyaou.com/LegendsZ/eg/WebWindowSystem/
- MVC各个层的作用
(1)控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图.并让相关视图去显示.(2)模型的作用是获取数据并处理数据.(3)视图的作用是将取得的数据进行组织.美化等,并最终向用户终端输出.
- BBS项目(2)
我们实现登录功能的随机验证码的产生 views.py def get_random_color(): return ( # 创建三个0-255的随机数 random.randint(0, 255), ...
- 34 输入3个数a,b,c,按大小顺序输出
题目:输入3个数a,b,c,按大小顺序输出 public class _034Sorting { public static void main(String[] args) { sorting(); ...
- thinkphp+memcache缓存例子
public function dailyRelays() { $history = I('post.history'); $da = new \Home\Model\DailyrelayModel( ...
- activiti监听器
activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,通常有如下一些场景: 1.activiti人员动态的分配. 2.当前任务节点完成的时候,指定需要指定下一个节点的处理人( ...