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 ...
随机推荐
- Openssl genrsa命令
一.简介 生成RSA私有密钥 二.语法 openssl genrsa [-out filename] [-passout arg] [-f4] [-] [-rand file(s)] [-engine ...
- [C++] decltype(auto) C++ 11 feature
1 //C++ 11 feature template <class T1, class T2> auto getMultiply(T1 data1, T2 data2) -> de ...
- [C++] Sign and magnitude,Ones' complement and Two's complement
Sign and magnitude,Ones' complement and Two's complement
- [SoapUI] JsonPath 语法 与 XPath 对比
XPath JSONPath Description / $ the root object/element . @ the current object/element / . or [] chil ...
- [Jenkins] 执行SoapUI的task,里面包含多个Project,发出的报告也要求包含多个Project,设置邮件内容为HTML+CSS
执行SoapUI的task,里面包含多个Project,发出的报告也要求包含多个Project,设置邮件内容为HTML+CSS 如何保证样式在邮件内容中不丢失 <link title=" ...
- Oracle——序列、索引、同义词
一.常见的数据库对象 二.序列 序列: 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 ①.创建序列 CREATE SEQ ...
- 设计模式(java)--模版方法模式之任务分配
转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构 ...
- JAVA并发设计模式学习笔记(二)—— Single Threaded Execution Pattern
注:本文的主要参考资料为结城浩所著<JAVA多线程设计模式>. 单线程执行模式(Single Threaded Execution Pattern)是最简单的多线程设计模式,几乎所有其他的 ...
- XJOI 3605 考完吃糖(DAG图dfs)
题目描述: 期末考试考完了,分数也出来了,大家准备吃糖庆祝一下,为了鼓励同学们下学期能取得更好的成绩,司马红豆同学让n个同学站成一排,如果某个同学的分数比相邻的一个同学要高,那么他得到的糖果就会比这个 ...
- getTextContent()方法会出现The method getTextContent() is undefined for the type Node 提示
eclipse 中 如果加入了 其他了xfire 等其他xml解析包的话,使用org.w3c.dom.Node下的getTextContent()方法会出现The method getTextCont ...