欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年04月12日 09:41:08   作者:滕青山Y(jié)YDS  
這篇文章主要介紹了java中如何對(duì)arrayList按數(shù)字大小逆序排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

對(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),這里簡單介紹一下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ù),可以使用差值簡化寫法,正數(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)定性排序。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改的代碼詳解

    spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改的代碼詳解

    這篇文章主要介紹了spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解

    Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • spring @Cacheable擴(kuò)展實(shí)現(xiàn)緩存自動(dòng)過期時(shí)間及自動(dòng)刷新功能

    spring @Cacheable擴(kuò)展實(shí)現(xiàn)緩存自動(dòng)過期時(shí)間及自動(dòng)刷新功能

    用過spring cache的朋友應(yīng)該會(huì)知道,Spring Cache默認(rèn)是不支持在@Cacheable上添加過期時(shí)間的,雖然可以通過配置緩存容器時(shí)統(tǒng)一指定,本文主要介紹了如何基于spring @Cacheable擴(kuò)展實(shí)現(xiàn)緩存自動(dòng)過期時(shí)間以及緩存即將到期自動(dòng)刷新,
    2024-02-02
  • struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例

    struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例

    本篇文章主要介紹了struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Java設(shè)計(jì)模式中責(zé)任鏈模式詳解

    Java設(shè)計(jì)模式中責(zé)任鏈模式詳解

    責(zé)任鏈模式是將鏈中的每一個(gè)節(jié)點(diǎn)看做是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不相同,且內(nèi)部自動(dòng)維護(hù)下一個(gè)節(jié)點(diǎn)對(duì)象,當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥伟l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象。本文將通過示例和大家詳細(xì)聊聊責(zé)任鏈模式,需要的可以參考一下
    2022-11-11
  • java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例

    java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例

    這篇文章主要介紹了java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java的五種數(shù)據(jù)類型解析

    java的五種數(shù)據(jù)類型解析

    下面小編就為大家?guī)硪黄猨ava的五種數(shù)據(jù)類型解析。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn)

    mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn)

    數(shù)據(jù)加解密的實(shí)現(xiàn)方式多種多樣,在mybatis環(huán)境中數(shù)據(jù)加解密變得非常簡單易用,本文主要介紹了mybatis中數(shù)據(jù)加密與解密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java中創(chuàng)建對(duì)象的5種方式總結(jié)

    Java中創(chuàng)建對(duì)象的5種方式總結(jié)

    本篇文章主要介紹了Java中創(chuàng)建對(duì)象的5種方式總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • MongoDB中ObjectId的誤區(qū)及引起的一系列問題

    MongoDB中ObjectId的誤區(qū)及引起的一系列問題

    這篇文章主要介紹了MongoDB中ObjectId的誤區(qū)及引起的一系列問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12

最新評(píng)論