比较器Comparator的试用

    技术2022-05-11  86

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

    最新回复(0)