Comparable接口和Comparator接口

来源:互联网 发布:sqlserver linux 原理 编辑:程序博客网 时间:2024/05/21 05:37

目录

1 介绍

2 Comparable接口

3 Comparator接口

4 总结

 

1 介绍

      有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要再带假发,那么谁可以有多种颜色的头发?在这种情况下,有头发的人,因为他的头发和自身绑定在一起,是无法在换头发的;而光头的头发(假发套)和其自身是不绑定的,可以根据自己喜欢换不同颜色的发套。有头发的人叫Comparable,光头不是孟飞,也不是乐嘉,叫Comparator。

 

 

    Comparable和Comparator是java中2个比较接口。Comparable是和具体类绑定的,我们称为“静态绑定”(如上图中有头发的人,头发是Comparable,头是具体的类)。而对于Comparator,具体的类在需要是可选择不同的Comparator绑定,是“动态绑定”(策略模式)(如上图中光头的人,假发是Comparator,头是具体的类,可根据需要选择不同的假发)。两者相比,Comparator比Comparable灵活,而且具体类可以在需要时选择不同的Comparator。

2 Comparable接口

    java.lang. Comparable接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。Comparable只包含一个方法:

[java] view plaincopy
  1. public interface Comparable<T> {   
  2.   
  3.     public int compareTo(T o);   
  4.   
  5. }   
int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值。String类实现了Comparable接口。
    需要比较或排序的对象,可以选择实现Comparable接口,自定义比较算法。
例子
[java] view plaincopy
  1. import java.util.Arrays;  
  2.   
  3. /**  
  4.  * @version 1.0 
  5.  * @date    2012-11-15 下午2:25:27  
  6.  * @fuction  实现Comparable接口 (先按序号比较,序号相等在比较姓名) */  
  7.   
  8.     public  class Student implements Comparable  
  9.     {  
  10.         //学号  
  11.         int num;  
  12.         //姓名  
  13.         String name;  
  14.           
  15.         //constructor  
  16.         public Student(int num,String name)  
  17.         {  
  18.             this.num=num;  
  19.             this.name=name;  
  20.         }  
  21.   
  22.         //重写java.lang中的接口Comparable的方法compareTo,定制比较的规则.但必须遵守比较规则(比较结果大返回正数,相等返回0,小返回负数)  
  23.         public int compareTo(Object o) {  
  24.             Student s=(Student)o;  
  25.             int result=num>s.num ? 1:(num==s.num ? 0: -1);  
  26.             //学号相等时,按名字排序  
  27.             if(0==result)  
  28.             {  
  29.                 //利用String的compareTo方法进行字符的比较  
  30.                 result=name.compareTo(s.name);  
  31.             }  
  32.             return result;  
  33.         }  
  34.   
  35.         @Override  
  36.         public String toString() {  
  37.             return "Student [num=" + num + ", name=" + name + "]";  
  38.         }  
  39.           
  40.           
  41.     /** 
  42.      * @param args 
  43.      */  
  44.     public static void main(String[] args) {  
  45.         Student[] test=new Student[]{new Student(2"wangwu"),  
  46.                                      new Student(1"lisi"),  
  47.                                      new Student(1"goudan") };  
  48.         //排序  
  49.         Arrays.sort(test);  
  50.           
  51.         //打印  
  52.         for(int i=0;i<test.length;i++)  
  53.         {  
  54.             System.out.println(test[i]);  
  55.               
  56.         }  
  57.           
  58.         //搜索姓名为“wangwu”的学生     
  59.         int index=Arrays.binarySearch(test,new Student(2,"wangwu"));   
  60.         System.out.println("查找的学生在数组中的位置:"+index);     
  61.     }  
  62.   
  63. }  

3 Comparator接口

 java.util.Comparator接口只包含2个方法

[java] view plaincopy
  1. int compare(T o1, T o2);  
[java] view plaincopy
  1. boolean equals(Object obj);  

int compare(T o1, T o2);比较用来排序的两个参数。 

boolean equals(Object obj);指示是否其他对象“等于”此 Comparator。

实现了compare接口的类具体的实现是在compare方法中自定义比较算法,然后将Comparator对象(实现了java.util.Comparator接口的对象)作为一个参数传递给欲比较或排序对象collection的某些排序方法。某些排序方法指的是能够接受java.util.Comparator参数的方法,比如:java.util. Arrays的public static void sort(Object[] a, Comparator c)和Collections的sort方法。

例子

[java] view plaincopy
  1. import java.util.Arrays;  
  2. import java.util.Comparator;  
  3.   
  4. /** 
  5.  * @version 1.0 
  6.  * @date 2012-11-15 下午11:21:09 
  7.  * @fuction 实现Comparator接口的比较算法 
  8.  *按学号排序 先按学号排序,学号相等时,按姓名排序 o1>o2返回1,o1=o2返回0,o1>o2返回-1 
  9.  */  
  10.   
  11. public class ByNumComparator implements Comparator {  
  12.   
  13.     public int compare(Object o1, Object o2) {  
  14.         Student s1 = (Student) o1;  
  15.         Student s2 = (Student) o2;  
  16.         // 按学号排序  
  17.         int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1);  
  18.         // 学号相等时,按名字排序  
  19.         if (result == 0) {  
  20.             int copmpareName=s1.name.compareTo(s2.name);  
  21.         //利用String的compareTo方法进行字符的比较    
  22.            if(copmpareName>0)  
  23.             result=1;  
  24.            else if (copmpareName==0)  
  25.             result=0;  
  26.            else  
  27.             result=-1;  
  28.         }  
  29.   
  30.         return result;  
  31.     }  
  32.   
  33.     public static void main(String[] args) {  
  34.         Student[] test = new Student[] { new Student(2"wangwu"),  
  35.                 new Student(1"lisi"), new Student(1"goudan") };  
  36.         // 排序  
  37.         Arrays.sort(test, new ByNumComparator());  
  38.   
  39.         // 打印  
  40.         System.out.println("排序之后");  
  41.         for (int i = 0; i < test.length; i++) {  
  42.             System.out.println(test[i]);  
  43.   
  44.         }  
  45.   
  46.     }  
  47.   
  48. }  



输出结果:

排序之后
Student [num=1, name=goudan]
Student [num=1, name=lisi]
Student [num=2, name=wangwu]

4 总结

       一般在对对象进行比较或排序时,需要对象实现Comparable接口或者在使用排序方法(比如Arrays的sort)方法时,传入实现了Comparator接口的类的对象。


参考: http://blog.csdn.net/zhongyangzhong/article/details/8188871