近段时间有空就在熟悉Java,所以也常常在上看看相关的帖子。那天有人问如何利用Arrays的sort方法实现对int数组的逆序排列,自然可以直接写这么一个逆序排列函数,不过由于Arrays的sort还可以利用比较器Comparator比较精确地控制排序,所以也试着用比较器做了一下,程序如下:
import
java.util.
*
;
public
class
test
...
{ public static void main(String[] arg) throws Exception...{ Integer a[]=...{21,31,1,9,5,10};//原始数组 ComDown c=new ComDown();//定义比较器实例 Arrays.sort(a,c);//利用比较器控制排序 for(int i=0; i<a.length;i++) System.out.print(a[i]+" ");//输出 }}
//
派生Comparator接口的Integer类型类
class
ComDown
implements
Comparator
<
Integer
>
...
{ public int compare(Integer i1, Integer i2) ...{//实现compare方法 if(i1>i2) return -1;//控制逆序排列 else if(i1<i2) return 1; else return 0; } }
从使用来看,比较器接口的应用可以构造一个通用的排序控制方法。上述代码就实现了对于Integer类型数组的逆序排列。不过遗憾的是,由于Java中的泛型只能对对象操作,对于int一类的简单类型不能象C++的模版一样使用,所以对简单类型的操作似乎反而不如直接写排序方法简单直接。不过比较器特别对于一些常规意义上不能排序的对象能够实现排序,也能够方便地进行重用,这是它的优点。如下例,就对自定义的一个Person类构造了依据姓名和年龄的两个比较器,从而方便地实现了不能直接排序的Person对象的排序。
import
java.util.
*
;
public
class
test ...
...
{ public static void main(String[] arg) throws Exception......{ Person a[]=new Person[2]; a[0]=new Person("ZhangSan",28); a[1]=new Person("LiSi",19); ComName cn=new ComName(); ComAge ca=new ComAge(); Arrays.sort(a,cn); for(int i=0; i<a.length;i++) a[i].print(); Arrays.sort(a,ca); for(int i=0; i<a.length;i++) a[i].print(); }}
class
Person ...
...
{ public String name; public int age; Person(String n, int a) ......{ name=n; age=a; } public void print() ......{ System.out.println("Name is "+name+", Age is "+age); }}
class
ComName
implements
Comparator
<
Person
>
...
...
{ public int compare(Person p1, Person p2) ......{ return p1.name.compareTo(p2.name); } }
class
ComAge
implements
Comparator
<
Person
>
...
...
{ public int compare(Person p1, Person p2) ......{ if(p1.age>p2.age) return -1; else if(p1.age<p2.age) return 1; else return 0; }}
下面则是利用字符串中数字所标示的位置来控制int数组中比较元素的二维数组排序比较器:
import
java.util.
*
;
public
class
test
...
{ public static void main(String[] arg)throws Exception ...{ int ary[][]=...{...{2,5,1,0,6},...{6,9,4,8,5},...{3,6,4,7,5},...{2,3,1,5,7}}; sort2 s=new sort2("0213"); Arrays.sort(ary,s);Arrays.sort(ary,s); for(int[] a:ary) ...{ for(int i:a) System.out.print(i+" "); System.out.println(); } }}
class
sort2
implements
Comparator
<
int
[]
>
...
{ private String ss;//控制比较位置的字符串 private int ind=0;//控制字符串索引 public sort2(String s)...{ss=s+"0";} public int compare(int a[], int b[]) ...{ int r; if(a[Integer.parseInt(ss.substring(ind,ind+1))]>b[Integer.parseInt(ss.substring(ind,ind+1))]) r=1; else if(a[Integer.parseInt(ss.substring(ind,ind+1))]<b[Integer.parseInt(ss.substring(ind,ind+1))]) r=-1; else r=0; ind++; if(ind>=ss.length()) ind=0; //如果比较完成,初始化ind为0 return r; }}