算法笔记:自定义排序 Comparator

算法笔记:自定义排序 Comparator

在做算法题时经常需要排序,java提供Arrays.sort(),但是默认只能从小到大排序一维数组,如果想排序二维数组,或者自定义排序规则:从小到大、字符串排序规则等,需要传入Comparator接口并实现里面的compare方法。

compare方法

返回值int

参数:T o1,T o2

返回正数则正序,否则逆序。

例1:从大到小排序

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

public class Sort {
    @Test
    public void comparator1(){
        Integer[] arr={1,2,1,3,4,8,7};
        Arrays.sort(arr,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;//从大到小 快排 如果是o1-o2从小到大
            }
        });
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
}

必须是对包装类数组或者多维数组自定义排序,int没办法自定义排序。

o1-o2>0,则交换两个数,否则不变,同理o2-o1你可以在纸上画一画,试一下,注意不是快排(之前写的快排,纠正,对于非基本类型不是快排,sort自动选择用插入排序或归并排序看哪个效率高)。
【宫水三叶の相信科学系列】为什么根据「拼接结果的字典序大小」决定「其在序列里的相对

例2:对二维数组排序

public void comparator2(){
        int[][] arr={{1,2},{2,3},{3,4},{1,3}};
        Arrays.sort(arr,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[1]-o2[1];//按下标1的大小排序 从小到大
            }
        });
        for (int i=0;i<arr.length;i++){
            for(int j=0;j<arr[0].length;j++) {
                System.out.print(arr[i][j] + " ");
            }
        }
    }

参考题目:leetcode435 无重叠区间

例3:对字符串排序compareTo

public void comparator3(){
        String[] arr={"10","11","3","0","5"};
        Arrays.sort(arr,new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2);//从大到小排 例:"510" "105"返回正值交换
            }
        });
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }

compareTo作用: 返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值。

参考题目:LeetCode179 最大数

对大数排序

有大数的时候不要用减号,用大于、小于就好了,不然越界!

public void comparator2(){
        int[][] arr={{1,2},{2,3},{3,4},{1,3}};
        Arrays.sort(arr,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1]>=o2[1])
                    return 1;
                else return -1;
                //按下标1的大小排序 从小到大
            }
        });
        for (int i=0;i<arr.length;i++){
            for(int j=0;j<arr[0].length;j++) {
                System.out.print(arr[i][j] + " ");
            }
        }
    }

参考题目:LeetCode452. 用最少数量的箭引爆气球

可以自测一下
剑指 Offer 45. 把数组排成最小的数

参考

常见的接口与类 – Comparator

Comparator的compare方法如何定义升序降序(源码角度)

LeetCode题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值