最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

代碼

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實現(xiàn)自定義排序

ArrayList排序使用

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

代碼實現(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ù)可以是任意對象
? ? ? ? int[] data = {7, 5, 1, 2, 6, 8, 10, 12, 4, 3, 9, 11, 13, 15, 16, 14};
? ? ? ? // 構(gòu)建成一個集合
? ? ? ? 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都升級到1.8以上,所以使用lamda表達式實現(xiàn),這里簡單介紹一下lamda表達式使用:

  • 以逗號分隔,以()關(guān)閉的形參:(Integer m, Integer n)
  • 箭頭標記:->
  • 主體部分則是一個單表達式或者聲明代碼塊。
  • 如下是單表達式形式:
(o1, o2) -> o2.getAge() - o1.getAge()

注意點:

  • Java7,list并沒有sort方法,請使用Collections.sort(),Collections.sort()傳入ArrayList和自己實現(xiàn)Commparator接口的類的對象,實現(xiàn)自定義排序
  • 使用Collections.sort()傳入ArrayList和自己實現(xiàn)Commparator接口的類的對象,實現(xiàn)自定義排序
  • 使用List.sort()傳入自己實現(xiàn)Commparator接口的類的對象,實現(xiàn)自定義排序
  • Comparator返回值在jdk1.7、jdk1.8里必須是一對相反數(shù),可以使用差值簡化寫法,正數(shù)表示升序,負數(shù)表示降序
  • ArrayList中的sort排序是采用歸并排序的,當數(shù)組中的數(shù)據(jù)非常大的時候,會采用幾次歸并來完成排序.具體采用幾次歸并,會通過相關(guān)方法進行計算

原理分析

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

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

在數(shù)據(jù)量較大的時候,如果是基本類型,使用快速排序,如果是引用類型使用歸并排序。這是因為快速排序是不穩(wěn)定的,而插入排序和歸并排序都是穩(wěn)定性排序。

總結(jié)

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

相關(guān)文章

  • Spring一步到位精通攔截器

    Spring一步到位精通攔截器

    攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2023-01-01
  • Java?對象在?JVM?中的內(nèi)存布局超詳細解說

    Java?對象在?JVM?中的內(nèi)存布局超詳細解說

    這篇文章主要介紹了Java?對象在?JVM?中的內(nèi)存布局超詳細解說,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 如何使用MybatisPlus快速進行增刪改查詳解

    如何使用MybatisPlus快速進行增刪改查詳解

    增刪改查在日常開發(fā)中是再正常不多的一個需求了,下面這篇文章主要給大家介紹了關(guān)于如何使用MybatisPlus快速進行增刪改查的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Java多線程中的互斥鎖解析

    Java多線程中的互斥鎖解析

    這篇文章主要介紹了Java多線程中的互斥鎖解析,Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性,每個對象都對應于一個可稱為互斥鎖的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象,需要的朋友可以參考下
    2023-09-09
  • Java?RabbitMQ的持久化和發(fā)布確認詳解

    Java?RabbitMQ的持久化和發(fā)布確認詳解

    這篇文章主要為大家詳細介紹了RabbitMQ的持久化和發(fā)布確認,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • JavaAgent原理及實踐分享

    JavaAgent原理及實踐分享

    這篇文章主要介紹了JavaAgent原理及實踐,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Json字符串轉(zhuǎn)Java對象和List代碼實例

    Json字符串轉(zhuǎn)Java對象和List代碼實例

    這篇文章主要介紹了Json字符串轉(zhuǎn)Java對象和List代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java輸入數(shù)字,輸出倒序的實例

    java輸入數(shù)字,輸出倒序的實例

    這篇文章主要介紹了java輸入數(shù)字,輸出倒序的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java字符串排序的幾種實現(xiàn)方式

    Java字符串排序的幾種實現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java字符串排序的幾種實現(xiàn)方式, 使用Java平臺進行字符串排序被認為是一件簡單的工作,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • SpringCloud feign微服務調(diào)用之間的異常處理方式

    SpringCloud feign微服務調(diào)用之間的異常處理方式

    這篇文章主要介紹了SpringCloud feign微服務調(diào)用之間的異常處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

南阳市| 炉霍县| 元朗区| 清新县| 江油市| 榆树市| 天全县| 奉节县| 罗城| 图木舒克市| 新化县| 怀远县| 会昌县| 广汉市| 稷山县| 高雄市| 灵武市| 浑源县| 东兰县| 万载县| 青岛市| 稷山县| 舟曲县| 舞钢市| 新民市| 丹棱县| 石河子市| 略阳县| 中西区| 犍为县| 罗平县| 临桂县| 邯郸市| 峨眉山市| 淮阳县| 玉田县| 虞城县| 辽阳市| 大渡口区| 沂源县| 锦屏县|