天天看點

算法筆記:自定義排序 Comparator算法筆記:自定義排序 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題目

繼續閱讀