java.lang.Comparable接口
来源:互联网 发布:android商业项目源码 编辑:程序博客网 时间:2024/06/10 17:17
java.lang.Comparable接口
作者:zccst
java.lang.Comparable接口定义的compareTo()方法用于提供对其实现类的对象进行整体排序所需要的比较逻辑。
实现类基于compareTo()方法的排序被称为自然排序。而compareTo()方法的排序被称为它的自然排序。具体的排序原则可由实现类根据需要而定。用户在重写compareTo()方法以定制比较逻辑时,需要确保其余等价性判断方法equals()保持一致,即e1.equals((Object)e2)和e1.compareTo((Object)e2)==0具有相同的值,这样的话我们就称自然顺序就和equals一致。
这个接口有什么用呢?
如果一个数组中的对象实现了Compareable接口,则对这个数组进行排序非常简单:Arrays.sort();如果List实现了该接口的话,我们就可以调用Collections.sort或者Arrays方法给他们排序。实际上Java平台库中的所有值类(value classes)都实现了Compareable接口。
Comparable接口只有一个方法compareTo(Object obj)
其中
this < obj 返回负
this = obj 返回 0
this > obj 返回正
即将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、0或正整数,如果无法进行比较,则抛出ClassCastException异常。
其实,有两种方式可以进行集合排序 :
1.集合中对象的所属类实现了java.lang.Comparable接口
2.为集合指定比较器java.lang.Comparator的实现类
Comparator,Comparable接口的区别是:
comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合 collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
而Comparator的作用有两个:
1. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序
2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
例如:Person.java、TestComparable.java
(1) Person.java
public class Person implementsjava.lang.Comparable{
privatefinal int id;
privateString name;
privateint age;
publicPerson(int id,String name,int age){
this.id= id;
this.name= name;
this.age= age;
}
publicint getId(){
returnid;
}
publicvoid setName(String name){
this.name= name;
}
publicString getName(){
returnname;
}
publicvoid setAge(int age){
this.age= age;
}
publicint getAge(){
returnage;
}
publicString toString(){
return"Id: " + id + "/tName: " + name + "/tAge: " +age;
}
@Override
publicint compareTo(Object o){ //实现Comparable接口的抽象方法,定义排序规则
Personp = (Person)o;
returnthis.id - p.id; //升序排列,反之降序
}
@Override
publicboolean equals(Object o){ //equals
booleanflag = false;
if(oinstanceof Person){
if(this.id== ((Person)o).id)
flag= true;
}
returnfalse;
}
}
(2) TestComparable.java
import java.util.TreeSet;
import java.util.Iterator;
public class TestComparable{
publicstatic void main(String[] args) {
TreeSetts = new TreeSet();
ts.add(newPerson(1003,"张三",15));
ts.add(newPerson(1008,"李四",25));
ts.add(newPerson(1015,"王五",73));
ts.add(newPerson(1001,"赵六",49));
Iteratorit = ts.iterator();
while(it.hasNext()){
Personemployee = (Person)it.next();
System.out.println(employee);
}
}
}
运行结果:
Id: 1001 Name: 赵六 Age: 49
Id: 1003 Name: 张三 Age: 15
Id: 1008 Name: 李四 Age: 25
Id: 1015 Name:王五 Age: 73
- java.lang.Comparable接口
- java.lang.Comparable接口
- java.lang.Comparable 接口
- java.lang.Comparable 接口 详解
- java.lang.Comparable 接口 详解
- java.lang.Comparable 接口 详解
- java.lang.Comparable接口小结
- java.lang.Comparable翻译
- java.lang.Comparable
- JAVA Comparable接口应用
- java的comparable 接口
- Java Comparable接口详解
- Java comparable接口
- java中Comparable接口
- java Comparable 接口
- 【java】Comparable接口
- Java Comparable 接口
- Java Comparable 接口
- java.util.Iterator(迭代器)
- 关于工程、控件引用
- 静态web和动态web的区别与联系
- Set接口——HashSet和TreeSet
- Eclipse插件links安装:
- java.lang.Comparable接口
- VB获取执行程序图标
- 删除群集方法
- ubuntu 手动编译lamp
- Extjs ComboBox 模糊过滤(转载)
- 领测软件测试网第35期软件测试交流会相关资料
- 一套Java面向对象技术试题的分析
- 保证你35岁以前成功的经典秘籍
- UltraWebListbar 的问题