java数据结构-Comparable&Comparator

java数据结构-Comparable&Comparator
在深入了解TreeMap之前,有两个接口要先弄清楚,分别是Comparable和Comparator

Comparable & Comparator

Comparable
Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)。

它只有一个方法,int compareTo(T o),用来比较当前对象和传入的参数,查看jdk api,共有这一批类实现了此接口,见下图


打开实现了该接口的Integer包装类查看源码

public   final   class  Integer  extends  Number  implements  Comparable < Integer >  {

    
public   int  compareTo(Integer anotherInteger) {
    
int  thisVal  =   this .value;
    
int  anotherVal  =  anotherInteger.value;
    
return  (thisVal < anotherVal  ?   - 1  : (thisVal == anotherVal  ?   0  :  1 ));
    }

可以看到该方法通过当前的Integer对象的值是否大于传入的参数来得到返回值,Integer的compareTo实现是按数字大小的自然排序,再找另一个例子String

public   final   class  String
    
implements  java.io.Serializable, Comparable < String > , CharSequence
{
public   int  compareTo(String anotherString) {
    
int  len1  =  count;
    
int  len2  =  anotherString.count;
    
int  n  =  Math.min(len1, len2);
    
char  v1[]  =  value;
    
char  v2[]  =  anotherString.value;
    
int  i  =  offset;
    
int  j  =  anotherString.offset;

    
if  (i  ==  j) {
        
int  k  =  i;
        
int  lim  =  n  +  i;
        
while  (k  <  lim) {
        
char  c1  =  v1[k];
        
char  c2  =  v2[k];
        
if  (c1  !=  c2) {
            
return  c1  -  c2;
        }
        k
++ ;
        }
    } 
else  {
        
while  (n --   !=   0 ) {
        
char  c1  =  v1[i ++ ];
        
char  c2  =  v2[j ++ ];
        
if  (c1  !=  c2) {
            
return  c1  -  c2;
        }
        }
    }
    
return  len1  -  len2;
    }

可以看出String的compareTo实现是按字符串中字符的Unicode值进行排序的,也真是因为各种类实现的不同,所以只有在相互可比的类才能进行排序,否则会抛出java.lang.ClassCastException的异常。应该说Comparable是集合内部实现的排序,想要进行集合外的排序就需要Comparator接口。

Comparator
如果一个类不能实现Comparable接口,那么我们自己可以提供Comparator的排序,如果你不喜欢缺省的Comparator行为,照样可以编写自己的Comparator。

Comparator只有2个方法,分别为int compare(T o1, T o2) 和boolean equals(Object obj)

Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一个元素出现在第二个元素之前,则返回一个负值,如果第一个元素出现在第二个元素后面,返回一个正值,再否则,返回零。与Comparable不同的是Comparator是由用户自行决定处理。
通过一个小例子可以比较明确的看出

       class  ComparatorTest  implements  Comparator{
          
public   int  compare(Object u1, Object u2) {
            String uname1 
=  ((User)u1).getName();
            String uname2 
=  ((User)u2).getName();
            
return  uname1.compareTo(uname2);
        }
      }
      
class  User {
          
private  String name;
          
public  String getName(){
              
return   this .name;
          }
      }

Comparator比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。

你可能感兴趣的:(java数据结构-Comparable&Comparator)