近段时间有空就在熟悉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;
}
}


















































































