比较器Comparator的试用

本文介绍如何使用Java的Arrays.sort方法结合自定义Comparator实现不同类型的排序需求,包括整数数组的逆序排列及自定义对象的多属性排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值