在Java中實現List按自定義順序排序的幾種方案

在Java中實現List按自定義順序排序的幾種方案

在實際開發中,我們經常需要對集合中的對象按照特定字段進行排序。當排序規則不是簡單的字母或數字順序,而是自定義的順序時,我們需要采用特殊的方法。本文將以一個List<Person>按省份特定順序(北京、上海、廣州、深圳)排序為例,介紹幾種實現方案并分析它們的優缺點。

問題描述

我們有一個Person類:

@Data
public class Person {private String name;private int age;private String province;
}

需要將List<Person>按照省份的特定順序排序:北京 > 上海 > 廣州 > 深圳,其他省份排在最后。

解決方案

方案1:使用Map定義順序權重

Map<String, Integer> provinceOrder = Map.of("北京", 1,"上海", 2,"廣州", 3,"深圳", 4
);persons.sort(Comparator.comparingInt(p -> provinceOrder.getOrDefault(p.getProvince(), Integer.MAX_VALUE)
));

優點

  • 實現簡單直觀
  • 易于修改順序(只需調整Map)
  • 性能良好(O(1)的查找復雜度)

缺點

  • 需要額外維護一個Map
  • 順序修改時需要重建Map

方案2:使用Enum定義順序

enum ProvincePriority {BEIJING("北京", 1),SHANGHAI("上海", 2),GUANGZHOU("廣州", 3),SHENZHEN("深圳", 4),OTHER("其他", Integer.MAX_VALUE);private final String name;private final int priority;// 構造函數、getter等public static int getPriority(String provinceName) {return Arrays.stream(values()).filter(pp -> pp.name.equals(provinceName)).findFirst().orElse(OTHER).getPriority();}
}persons.sort(Comparator.comparingInt(p -> ProvincePriority.getPriority(p.getProvince())
));

優點

  • 類型安全
  • 可擴展性強
  • 易于維護(相關邏輯封裝在Enum中)

缺點

  • 實現稍復雜
  • 需要定義額外的Enum類

方案3:使用List.indexOf方法

List<String> order = List.of("北京", "上海", "廣州", "深圳");persons.sort(Comparator.comparingInt(p -> {int index = order.indexOf(p.getProvince());return index == -1 ? Integer.MAX_VALUE : index;
}));

優點

  • 代碼簡潔
  • 順序直觀可見(直接寫在List中)

缺點

  • 每次比較都需要查找索引(O(n)復雜度)
  • 性能不如前兩種方案

性能比較

對于大數據量排序的性能表現:

  1. Map方案:最佳,因為Map的查找是O(1)復雜度
  2. Enum方案:與Map方案相當,但可能稍慢(取決于Enum實現)
  3. List.indexOf方案:最差,因為每次比較都需要遍歷List

最佳實踐建議

  1. 小數據量:三種方案都可以,選擇最易讀的(通常是方案3)
  2. 大數據量:優先選擇方案1或方案2
  3. 需要強類型檢查:選擇方案2
  4. 順序可能頻繁變更:選擇方案1

擴展思考

  1. 多級排序:可以在Comparator中添加thenComparing實現多級排序

    persons.sort(Comparator.comparingInt(p -> provinceOrder.getOrDefault(p.getProvince(), Integer.MAX_VALUE)).thenComparing(Person::getAge)
    );
    
  2. 動態順序:可以從數據庫或配置文件中加載排序規則,實現動態排序

  3. 空值處理:需要考慮province為null的情況,可以在Comparator中添加null處理

總結

在Java中實現自定義順序排序有多種方式,選擇哪種方案取決于具體場景:

  • 簡單場景:使用List.indexOf方案(方案3)
  • 一般場景:推薦使用Map方案(方案1)
  • 復雜/企業級應用:考慮使用Enum方案(方案2)

無論選擇哪種方案,保持代碼的可讀性和可維護性都是最重要的考量因素。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77422.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務架構在云原生后端的深度融合與實踐路徑

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:后端架構的演變,走向云原生與微服務融合 過去十余年,后端架構經歷了從單體應用(Monolithic)、垂直切分(Modularization)、到微服務(Microservices)的演進,每一次變化都是為了解決…

Python中的Walrus運算符分析

Python中的Walrus運算符&#xff08;:&#xff09;是Python 3.8引入的一個新特性&#xff0c;允許在表達式中同時賦值和返回值。它的核心作用是減少重復計算&#xff0c;提升代碼簡潔性。以下是其適用的典型場景及示例&#xff1a; 1. 在循環中避免重復計算 當循環條件需要多次…

用Node.js施展文檔比對魔法:輕松實現Word文檔差異比較小工具,實現Word差異高亮標注(附完整實戰代碼)

引言&#xff1a;當「找不同」遇上程序員的智慧 你是否經歷過這樣的場景&#xff1f; 法務同事發來合同第8版修改版&#xff0c;卻說不清改了哪里 導師在論文修改稿里標注了十幾處調整&#xff0c;需要逐一核對 團隊協作文檔頻繁更新&#xff0c;版本差異讓人眼花繚亂 傳統…

前端瀏覽器窗口交互完全指南:從基礎操作到高級控制

瀏覽器窗口交互是前端開發中構建復雜Web應用的核心能力&#xff0c;本文深入探討23種關鍵交互技術&#xff0c;涵蓋從傳統API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨標簽頁的完整控制方案。 一、基礎窗口操作體系 1.1 窗口創建與控制 // 新窗口創建&#xff08;現代瀏…

Git和Gitlab的部署和操作

一。GIT的基本操作 1.GIT的操作和查看內容 [rootmaster ~]# yum install git -y [rootmaster ~]# git config --list&#xff1a;查看所有配置 2.GIT倉庫初始化 [rootmaster ~]# mkdir /gittest&#xff1a;創建目錄 [rootmaster ~]# cd /gittest/&#xff1a;進入目錄 [rootm…

Linux中線程池的簡單實現 -- 線程安全的日志模塊,策略模式,線程池的封裝設計,單例模式,餓漢式單例模式,懶漢式單例模式

目錄 1. 對線程池的理解 1.1 基本概念 1.2 工作原理 1.3 線程池的優點 2. 日志與策略模式 2.1 日志認識 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定義日志系統的實現 3. 線程池設計 3.1 簡單線程池的設計 3.2 線程安全的單例模式線程池的設計 3…

量子力學:量子通信

量子通信是利用量子力學原理對信息進行編碼、傳輸和處理的新型通信方式&#xff0c;以下是其詳細介紹及業界發展現狀&#xff1a; 基本原理 量子疊加態 &#xff1a;量子系統可以處于多個狀態的疊加&#xff0c;如光子的偏振方向可以同時處于水平和垂直方向的疊加態&#xff…

企業架構之旅(1):TOGAF 基礎入門

大家好&#xff0c;我是沛哥兒。今天我們簡單聊下TOGAF哈。 文章目錄 一、TOGAF 是什么定義與核心定位發展歷程與行業地位與其他架構框架的區別 二、TOGAF 核心價值企業數字化轉型助力業務與 IT 的協同作用降本增效與風險管控 三、TOGAF 基礎術語解析架構域&#xff08;業務、…

CSS 內容超出顯示省略號

CSS 內容超出顯示省略號 文章目錄 CSS 內容超出顯示省略號**1. 單行文本省略&#xff08;常用&#xff09;****2. 多行文本省略&#xff08;如 2 行&#xff09;****3. 對非塊級元素生效****完整示例****注意事項** 在 CSS 中實現內容超出顯示省略號&#xff0c;主要通過控制文…

路由器重分發(OSPF+RIP),RIP充當翻譯官,OSPF充當翻譯官

路由器重分發&#xff08;OSPFRIP&#xff09; 版本 1 RIP充當翻譯官 OSPF路由器只會OSPF語言&#xff1b;RIP路由器充當翻譯官就要會OSPF語言和RIP語言&#xff1b;則在RIP中還需要將OSPF翻譯成RIPOSPF 把RIP路由器當成翻譯官&#xff0c;OSPF路由器就只需要宣告自己的ip&am…

AlexNet網絡搭建

AlexNet網絡模型搭建 環境準備 首先在某個盤符下創建一個文件夾&#xff0c;就叫AlexNet吧&#xff0c;用來存放源代碼。 然后新建一個python文件&#xff0c;就叫plot.py吧&#xff0c;往里面寫入以下代碼&#xff0c;用于下載數據集&#xff1a; # FashionMNIST里面包含了…

【計算機網絡】網絡基礎概念

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 這是博主計算機網絡的第一篇文章&#xff0c;本文由于是基礎概念了解&#xff0c;引用了大…

在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽&#xff0c;你可以使用Apache POI來讀取Word文件&#xff0c;iText或Apache PDFBox來生成PDF文件&#xff0c;然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼&#xff1a; 1. 添加依賴 …

圖解 Redis 事務 ACID特性 |源碼解析|EXEC、WATCH、QUEUE

寫在前面 Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。Redis的事務是將多個命令請求打包&#xff0c;然后一次性、按照順序的執行多個命令的機制&#xff0c;并且在事務執行期間&#xff0c;服務器不會中斷事務而該去執行其他客戶端的命令請求。 就像下面這樣&#…

LeetCode --- 446 周賽

題目列表 3522. 執行指令后的得分 3523. 非遞減數組的最大長度 3524. 求出數組的 X 值 I 3525. 求出數組的 X 值 II 一、執行指令后的得分 照著題目要求進行模擬即可&#xff0c;代碼如下 // C class Solution { public:long long calculateScore(vector<string>&…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-前端美化滾動條問題

模擬面試界面左側底部 通過檢查工具定位到其所在的位置&#xff1a; 直接對該組件進行美化&#xff1a; <!-- AI面試官列表 --><div class"ai-interviewer-section" v-show"activeTab interviewer"><el-scrollbar class"no-horizont…

git版本回退 | 遠程倉庫的回退 (附實戰Demo)

目錄 前言1. 基本知識2. Demo3. 彩蛋 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn 本身暫存區有多個文件&#xff0c;但手快了&…

什么事Nginx,及使用Nginx部署vue項目(非服務器Nginx壓縮包版)

什么是 Nginx? Nginx(發音為 “engine-x”)是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。它以其高性能、高并發處理能力和低資源消耗而聞名。以下是 Nginx 的主要特性和用途: 主要特性 高性能和高并發 Nginx 能夠處理大量并發連接,適合高…

第十六周藍橋杯2025網絡安全賽道

因為只會web&#xff0c;其他方向都沒碰過&#xff0c;所以只出了4道 做出來的&#xff1a; ezEvtx 找到一個被移動的文件&#xff0c;疑似被入侵 提交flag{confidential.docx}成功解出 flag{confidential.docx} Flowzip 過濾器搜索flag找到flag flag{c6db63e6-6459-4e75-…

高性能的開源網絡入侵檢測和防御引擎:Suricata介紹

一、Debian下使用Suricata 相較于Windows&#xff0c;Linux環境對Suricata的支持更加完善&#xff0c;操作也更為便捷。 1. 安裝 Suricata 在Debian系統上&#xff0c;你可以通過包管理器 apt 輕松安裝 Suricata。 更新軟件包列表: sudo apt update安裝 Suricata: sudo apt …