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的实现类

ComparatorComparable接口的区别是:

comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合 collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。

前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。

一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。

Comparator的作用有两个:

  1. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序

2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序

 

 

例如:Person.javaTestComparable.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

 

 

 

 

 

原创粉丝点击