java中對List中的元素進行排序

来源:https://www.cnblogs.com/hylogs/archive/2018/07/22/9348789.html
-Advertisement-
Play Games

Collections對List集合中的數據進行排序 有時候需要對集合中的元素按照一定的規則進行排序,這就需要用到 Java中提供的對集合進行操作的工具類Collections,其中的sort方法 先看一個簡單的例子: reference: https://blog.csdn.net/veryisj ...


Collections對List集合中的數據進行排序

有時候需要對集合中的元素按照一定的規則進行排序,這就需要用到

Java中提供的對集合進行操作的工具類Collections,其中的sort方法


No1.先看一個簡單的例子:

 1     public static void main(String[] args) {
 2         List<Integer> nums = new ArrayList<Integer>();
 3         nums.add(2);
 4         nums.add(9);
 5         nums.add(7);
 6         nums.add(1);
 7         nums.add(0);
 8         System.out.println(nums);
 9         Collections.sort(nums);
10         System.out.println(nums);
11     }

 結果如下:

[2, 9, 7, 1, 0]
[0, 1, 2, 7, 9]


 建立一個No2代碼要用的entity,如下:

 1 import java.util.Date;
 2 
 3 public class Record implements Comparable<Record> {
 4     private String name;
 5     private int age;
 6     private Date start;
 7 
 8     public Record(String name, int age, Date start) {
 9         this.name = name;
10         this.age = age;
11         this.start = start;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public int getAge() {
23         return age;
24     }
25 
26     public void setAge(int age) {
27         this.age = age;
28     }
29 
30     public Date getStart() {
31         return start;
32     }
33 
34     public void setStart(Date start) {
35         this.start = start;
36     }
37 
38     @Override
39     public int compareTo(Record o) {
40         int nameIndex = this.name.compareTo(o.name);
41         int ageIndex = 0;
42         int startIndex = 0;
43         // 姓名一樣則比較年齡
44         if (nameIndex == 0) {
45             ageIndex = this.age - o.age;
46         }
47         // 年齡一樣則比較開始時間
48         if (ageIndex == 0) {
49             boolean isAfter = this.start.after(o.start);
50             if (isAfter) {
51                 startIndex = 1;
52             } else {
53                 startIndex = -1;
54             }
55         }
56         return nameIndex+ageIndex+startIndex;
57     }
58 
59 }

 


 No2.稍複雜一些的排序:

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.List;
 6 
 7 public class ListOrder {
 8     public static void main(String[] args) throws ParseException {
 9         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
10         List<Record> records = new ArrayList<Record>();
11         records.add(new Record("a", 2, df.parse("2015-12-16")));
12         records.add(new Record("d", 8, df.parse("2015-12-16")));
13         records.add(new Record("a", 1, df.parse("2019-12-16")));
14         records.add(new Record("x", 0, df.parse("2014-12-16")));
15         records.add(new Record("a", 1, df.parse("2018-12-16")));
16         for (Record record : records) {
17             System.out.println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
18         }
19         Collections.sort(records);
20         System.out.println("--------------------------------------");
21         for (Record record : records) {
22             System.out.println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
23         }
24     }
25 }

輸出結果:

name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
name :x age :0 start :Tue Dec 16 00:00:00 CST 2014
name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
--------------------------------------
name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
name :x age :0 start :Tue Dec 16 00:00:00 CST 2014


 

 Collections提供的第二種排序方法sort(List<T> list, Comparator<? super T> c)

所使用的entity:

 1 import java.util.Date;
 2 
 3 public class Record {
 4     private String name;
 5     private int age;
 6     private Date start;
 7 
 8     public Record(String name, int age, Date start) {
 9         this.name = name;
10         this.age = age;
11         this.start = start;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public int getAge() {
23         return age;
24     }
25 
26     public void setAge(int age) {
27         this.age = age;
28     }
29 
30     public Date getStart() {
31         return start;
32     }
33 
34     public void setStart(Date start) {
35         this.start = start;
36     }
37 }

No3:代碼:

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.Comparator;
 6 import java.util.List;
 7 
 8 public class ListOrder {
 9 
10     public static void main(String[] args) throws ParseException {
11         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
12         List<Record> records = new ArrayList<Record>();
13         records.add(new Record("a", 2, df.parse("2015-12-16")));
14         records.add(new Record("d", 8, df.parse("2015-12-16")));
15         records.add(new Record("a", 1, df.parse("2019-12-16")));
16         records.add(new Record("x", 0, df.parse("2014-12-16")));
17         records.add(new Record("a", 1, df.parse("2018-12-16")));
18         for (Record record : records) {
19             System.out
20                     .println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
21         }
22         Collections.sort(records, new Comparator<Record>() {
23             @Override
24             public int compare(Record r1, Record r2) {
25                 int nameIndex = r1.getName().compareTo(r2.getName());
26                 int ageIndex = 0;
27                 int startIndex = 0;
28                 // 姓名一樣則比較年齡
29                 if (nameIndex == 0) {
30                     ageIndex = r1.getAge() - r2.getAge();
31                 }
32                 // 年齡一樣則比較開始時間
33                 if (ageIndex == 0) {
34                     boolean isAfter = r1.getStart().after(r2.getStart());
35                     if (isAfter) {
36                         startIndex = 1;
37                     } else {
38                         startIndex = -1;
39                     }
40                 }
41                 return nameIndex + ageIndex + startIndex;
42             }
43         });
44         System.out.println("--------------------------------------");
45         for (Record record : records) {
46             System.out
47                     .println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
48         }
49     }
50 }

結果:

name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
name :x age :0 start :Tue Dec 16 00:00:00 CST 2014
name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
--------------------------------------
name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
name :x age :0 start :Tue Dec 16 00:00:00 CST 2014


 

reference:

https://blog.csdn.net/veryisjava/article/details/51675036

https://www.jb51.net/article/72284.htm

https://blog.csdn.net/u012901117/article/details/76853113


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 條件指令 所謂條件指令是指滿足某個條件時執行哪部分代碼,不滿足條件時執行哪部分條件代碼。vue條件指令有v-if,v-else-if,v-else三個,v-if條件渲染用來指示元素是否移除或者插入,根據表達式的值的真假條件渲染元素。 v-if示例 方式一使用v-if顯示標簽,當初始化值為true時, ...
  • 如果你是一個人在自學前端開發,或者是對前端開發有比較濃厚的興趣正想踏入前端領域,只要你在前端自學路上遇到了自己無法解決的技術難題,那麼儘管將你的疑惑交給我的小伙伴兒們吧,我們都是一群在前端自學路上摸爬滾打的有志青年,希望你可以來和我們共同交流。同時也希望你能獻出自己的一份力,幫助我的小伙伴兒們解決他 ...
  • JavaScript中數組有各種操作方法,以下通過舉例來說明各種方法的使用: 數組操作方法 push 在數組最後添加一個元素 pop 把數組最後一位取出來,並返回,且原來數組發生變化 shift 把數組第一位取出來,並返回,且原來數組發生變化 unshift 在數組第一位新增一個元素 join 把數 ...
  • 所謂meta標記就是用來描述一個HTML網頁文檔的屬性,也稱為元信息,這些信息並不會顯示在瀏覽器的頁面中,例如作者、日期和時間、網頁描述、頁面刷新等。 基本語法: <meta name = " "content=" "> <meta http-equiv=" " content = " "> nam ...
  • 最近一段時間內結束了資料庫表拆分項目,這裡做個簡單的小結。 本次拆分主要包括訂單和優惠券兩大塊,這兩塊都是覆蓋全集團所有分子公司所有業務線。隨著公司的業務飛速發展,不管是存儲的要求,還是寫入、讀取的性都基本上到了警戒水位。 訂單是交易的核心,優惠券是營銷的核心,這兩塊基本上是整個平臺的正向最核... ...
  • 1、緩存的意義 說到分散式系統基本上就離不開緩存,在高併發,大流量的場景下緩存更是扮演著重要的角色。所以作為一個分散式系統的開發人員是必須熟練掌握緩存的使用與設計。下麵是一張簡單的系統架構圖 從圖中我們知道了緩存在系統層面的所處位置,可以在應用系統的內部也可以在外部。那緩存的意義又是什麼呢? 1、縮 ...
  • 題意 Link 給出一張$n$個點的無向圖,每次詢問兩點之間邊權最大值最小的路徑 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ Sol 很顯然答案一定在最小生成樹上,但是此題還有一個更為玄學的做法—Kruskal重構樹 它是在Kr ...
  • 1.建立一個項目,導入jar包(ioc aop dao 連接池 資料庫驅動包)拷貝Spring容器對應的配置文件到src下 2.在配置文件中引入外部屬性文件 3.配置數據源 4.配置JdbcTemplate 5.設置屬性 6.測試 db.properties 1 driverClassName=or ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...