溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java中怎么對(duì)arrayList按數(shù)字大小逆序排序

發(fā)布時(shí)間:2023-05-06 10:51:13 來源:億速云 閱讀:118 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹“java中怎么對(duì)arrayList按數(shù)字大小逆序排序”,在日常操作中,相信很多人在java中怎么對(duì)arrayList按數(shù)字大小逆序排序問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java中怎么對(duì)arrayList按數(shù)字大小逆序排序”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    對(duì)arrayList按數(shù)字大小逆序排序

    對(duì)集合排序要用Collections.sort方法,由于默認(rèn)它是按從小到大的排序的,如果我們需要逆序的,那么就需要實(shí)現(xiàn)Comparator接口的compare方法來完成自定義排序。

    需要注意Comparator是接口,new Comparator(){} 的作用是new了一個(gè)實(shí)現(xiàn)接口的匿名類,開發(fā)人員需要在匿名類內(nèi)部(花括號(hào)內(nèi))實(shí)現(xiàn)你那個(gè)接口。

    代碼

    public static void main(String[] args) {
            Integer[] nums = {1,5,34,6,8,7,33};
            ArrayList<Integer> numberList = new ArrayList<>();
            Collections.addAll(numberList, nums);
    
            // 排序前
            System.out.println("逆序前 numberList " + numberList);
    
            // 排序后
            ArrayList<Integer> copyList = new ArrayList<>(numberList);
            Collections.sort(copyList, new Comparator<Integer>() {
                @Override
                public int compare(Integer num1, Integer num2) {
                    if (num1 > num2) {
                        return -1;
                    } else {
                        return 1;
                    }
                }
            });
            System.out.println("逆序后 copyList " + copyList);
            // 原列表不變
            System.out.println("逆序后 numberList " + numberList);
        }

    arrayList實(shí)現(xiàn)自定義排序

    ArrayList排序使用

    ArrayList中存在sort排序方法,只要你實(shí)現(xiàn)了Comparator的接口,按照你自己的排序業(yè)務(wù)進(jìn)行實(shí)現(xiàn),你只要告訴這個(gè)接口按照什么類型進(jìn)行排序就OK了。這種方式類似于設(shè)計(jì)模式中的策略模式,把流程劃分好,具體的業(yè)務(wù)邏輯由用戶指定

    代碼實(shí)現(xiàn):

    public class ComparatorTest {
        public static void main(String[] args) {
            baseTypeSort();
            referenceTypeSort();
    
        }
    
        private static void referenceTypeSort() {
            Person p1 = new Person(10);
            Person p2 = new Person(16);
            Person p3 = new Person(1);
            Person p4 = new Person(8);
            Person p5 = new Person(100);
    
            List<Person> people = new ArrayList<>();
            people.add(p1);
            people.add(p2);
            people.add(p3);
            people.add(p4);
            people.add(p5);
            System.out.println("排序前:" + people);
            people.sort((o1, o2) -> o2.getAge() - o1.getAge());
            System.out.println("降序:" + people);
            Collections.sort(people, (o1, o2) -> o1.getAge() - o2.getAge());
            System.out.println("升序:" + people);
            people.sort(Comparator.comparing(Person::getAge));
            System.out.println("comparing寫法升序:" + people);
            people.sort(Comparator.comparing(Person::getAge).reversed());
            System.out.println("comparing寫法降序:" + people);
        }
    
        private static void baseTypeSort() {
            // 初始化一組數(shù)據(jù),這組數(shù)據(jù)可以是任意對(duì)象
            int[] data = {7, 5, 1, 2, 6, 8, 10, 12, 4, 3, 9, 11, 13, 15, 16, 14};
            // 構(gòu)建成一個(gè)集合
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < data.length; i++) {
                list.add(data[i]);
            }
            System.out.println("排序前:" + list);
            //逆序
            list.sort((o1, o2) -> o2 - o1);
            System.out.println("降序:" + list);
        }
    }

    由于現(xiàn)在主流jdk都升級(jí)到1.8以上,所以使用lamda表達(dá)式實(shí)現(xiàn),這里簡(jiǎn)單介紹一下lamda表達(dá)式使用:

    • 以逗號(hào)分隔,以()關(guān)閉的形參:(Integer m, Integer n)

    • 箭頭標(biāo)記:->

    • 主體部分則是一個(gè)單表達(dá)式或者聲明代碼塊。

    • 如下是單表達(dá)式形式:

    (o1, o2) -> o2.getAge() - o1.getAge()

    注意點(diǎn):

    • Java7,list并沒有sort方法,請(qǐng)使用Collections.sort(),Collections.sort()傳入ArrayList和自己實(shí)現(xiàn)Commparator接口的類的對(duì)象,實(shí)現(xiàn)自定義排序

    • 使用Collections.sort()傳入ArrayList和自己實(shí)現(xiàn)Commparator接口的類的對(duì)象,實(shí)現(xiàn)自定義排序

    • 使用List.sort()傳入自己實(shí)現(xiàn)Commparator接口的類的對(duì)象,實(shí)現(xiàn)自定義排序

    • Comparator返回值在jdk1.7、jdk1.8里必須是一對(duì)相反數(shù),可以使用差值簡(jiǎn)化寫法,正數(shù)表示升序,負(fù)數(shù)表示降序

    • ArrayList中的sort排序是采用歸并排序的,當(dāng)數(shù)組中的數(shù)據(jù)非常大的時(shí)候,會(huì)采用幾次歸并來完成排序.具體采用幾次歸并,會(huì)通過相關(guān)方法進(jìn)行計(jì)算

    原理分析

    Collections.sort方法底層就是調(diào)用的Arrays.sort方法,而Arrays.sort底層調(diào)用了一個(gè)非常優(yōu)秀的工程排序?qū)崿F(xiàn)算法:TimSort,Timsort是一種結(jié)合了歸并排序和插入排序的混合算法,由Tim Peters在2002年提出,并且已經(jīng)成為Python 2.3版本以后內(nèi)置排序算法。

    在數(shù)據(jù)量小的時(shí)候使用插入排序,雖然插入排序的時(shí)間復(fù)雜度是O(n^2),但是它的常數(shù)項(xiàng)比較小,在數(shù)據(jù)量較小的時(shí)候具備較快的速度。

    在數(shù)據(jù)量較大的時(shí)候,如果是基本類型,使用快速排序,如果是引用類型使用歸并排序。這是因?yàn)榭焖倥判蚴遣环€(wěn)定的,而插入排序和歸并排序都是穩(wěn)定性排序。

    到此,關(guān)于“java中怎么對(duì)arrayList按數(shù)字大小逆序排序”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI