分享

Java常用类库

 jp乞巧楼 2015-07-30

 Java常用类库--比较器

Comparable接口:

详细信息:

方法摘要

 int

compareTo(T o)
          比较此对象与指定对象的顺序。

  

方法详细信息

 

compareTo

int compareTo(T o)

比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 

实现类必须确保对于所有的 和 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果 y.compareTo(x) 抛出一个异常,则 x.compareTo(y) 也要抛出一个异常。)

实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0

最后,实现者必须确保 x.compareTo(y)==0 意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:注意:此类具有与 equals 不一致的自然排序。

在前面的描述中,符号 sgn(expression指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -1或 中的一个值。

参数:

o- 要比较的对象。

返回:

负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

抛出:

ClassCastException如果指定对象的类型不允许它与此对象进行比较。

Comparable是个泛型接口,只有一个方法,其返回值有三种取值,

·1表示大于

·0表示等于

·-1表示小于

看如下程序:

package ArraysTest;

 

import java.util.*;

 

class Test implements Comparable<Test>{ //继承Comparable接口

String name;

int age;

public Test(String name,int age){

this.name=name;

this.age=age;

}

public int compareTo(Test a){ //覆写compareTo方法,指示年龄从大到小排序

if(age<a.age)return 1;

else if(age==a.age)return 0;

else return -1;

}

public String toString(){

return name+"+age;

}

}

 

public class ArraysTest001 {

public static void main(String args[]){

Test t[]=new Test[5];

t[0]=new Test("Hello1",23);

t[1]=new Test("Hello2",34);

t[2]=new Test("Hello3",12);

t[3]=new Test("Hello4",23);

t[4]=new Test("Hello5",89);

Arrays.sort(t);

for(int i=0;i<5;i++){

System.out.println(t[i]);

}

}

}

 

排序方法为二叉排序。

 

Comparator接口:

方法摘要

 int

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

 boolean

equals(Object obj)
          指示某个其他对象是否等于此 Comparator


可以看看Arrays类的这两个sort方法:

static

 

sort(T[] a, Comparator<? super T> c)
          根据指定比较器产生的顺序对指定对象数组进行排序。

static

sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
          根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。


这两个方法不需要本类直接继承Comparable接口但是需要使用Comparator接口指定排序方法:

package ArraysTest;

 

import java.util.*;

 

class Test{

String name;

int age;

public Test(String name,int age){

this.name=name;

this.age=age;

}

public String toString(){

return name+"+age;

}

}

 

class Test1 implements Comparator<Test>{

public int compare(Test a,Test b){

if(a.age>b.age)return 1;

else if(a.age==b.age)return 0;

else return -1;

}

}

 

 

public class ArraysTest001 {

public static void main(String args[]){

Test t[]=new Test[5];

t[0]=new Test("Hello1",23);

t[1]=new Test("Hello2",34);

t[2]=new Test("Hello3",12);

t[3]=new Test("Hello4",23);

t[4]=new Test("Hello5",89);

Arrays.sort(t,new Test1());

for(int i=0;i<5;i++){

System.out.println(t[i]);

}

}

}

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多