Java中Arrays.sort的Comparator比较器

一、Arrays.sort

Arrays.sort()是给数组排序的,默认是升序

public class Test5 {
 
    public static void main(String[] args) {
        int[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
        Arrays.sort(arr);
        for(int x:arr){
            System.out.print(x); //print: 0123456789
        }
    }
}

二、comparator

Comparator 是 Java 中的一个函数式接口,位于 java.util 包中。它用于定义对象的排序规则,通常用于对集合中的元素进行排序。

Comparator 的使用方法

Comparator 接口中最重要的方法是 compare(T o1, T o2),它接受两个参数并返回一个整数。

compare的参数o1、o2 也是泛型T,即排序的元素也不能是基本数据类型。

Java中默认是升序排序的,就是如果你重写了compare方法的逻辑,它不管你compare方法内部是怎么比较的,返回正整数则认为o1>o2,返回0则认为o1=o2,返回负整数则认为o2>o1,所以他会比较List集合中所有的元素,得到确定大小的结果进行升序排序。

打个比方,这个代码块:

@Override
public int compare(Integer o1, Integer o2) {
    return o1-o2;
}

假如现在开始比较,o1的值为1,o2的值为2,那么return的就是1-2=-1,返回-1,那么在比较器中认为1<2的,这个是正常思维的,但是假如把里面的返回逻辑改掉了,改成o2-o1,那么同样的o1=1,o2=2的情况下,返回的就是2-1=1,那么比较器就会认为1>2,比较器就会把2排序的更前面一点(因为它认为2是小于1的),这样就变成了降序排序。

使用Arrays.sort()方法并用comparator自定义排序规则,如下从大到小排序:

public class Test5 {
 
    public static void main(String[] args) {
        Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
 
        for(int x:arr){
            System.out.print(x); //print: 9876543210
        }
    }

用comparator给二维数组排序

假设现在有一个二维数组,我们需要按照第一个元素给二维数组排序,即只参照第一个元素,不管第二个元素,给二维数组从小到大进行排序,如下就是排序好的结果:

public class Test5 {
 
    public static void main(String[] args) {
        int[][] arr = {{1,9},{2,5},{19,20},{10,11},{12,20},{0,3},{0,1},{0,2}};
        Arrays.sort(arr,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }
        });
 
 
        for(int[] a:arr){
            System.out.print(a[0]);
            System.out.print('-');
            System.out.print(a[1]);
            System.out.print(',');  //print:0-3,0-1,0-2,1-9,2-5,10-11,12-20,19-20,
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值