Java常用类库--比较器
Comparable接口:
详细信息:
compareTo
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
实现类必须确保对于所有的 x 和 y 都存在 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、0 或 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接口:
可以看看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]);
}
}
}
|