深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

文章目錄

  • 深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()
    • 1. 方法定義
      • comparingByKey()
      • comparingByValue()
    • 2. 基本用法
      • 2.1 使用comparingByKey()
      • 2.2 使用comparingByValue()
    • 3. 方法重載版本
      • comparingByKey(Comparator)
      • comparingByValue(Comparator)
    • 4. 高級用法示例
      • 4.1 逆序排序
      • 4.2 自定義比較邏輯
      • 4.3 鏈式比較
    • 5. 與Collections.max/min結合使用
    • 6. 性能考慮
    • 7. 實際應用場景
      • 7.1 統計最高分學生
      • 7.2 商品按價格排序
      • 7.3 單詞頻率統計
    • 8. 注意事項
    • 9. 與相關方法的比較
    • 10. 總結


深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

Java 8引入的Map.Entry.comparingByValue()Map.Entry.comparingByKey()是兩個非常實用的比較器工廠方法,專門用于比較Map的條目(Entry)。本文將詳細解析這兩個方法的用法、區別以及實際應用場景。

1. 方法定義

comparingByKey()

public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey()
  • 創建一個按鍵的自然順序比較Map條目的Comparator
  • 鍵類型K必須實現Comparable接口

comparingByValue()

public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue()
  • 創建一個按值的自然順序比較Map條目的Comparator
  • 值類型V必須實現Comparable接口

2. 基本用法

2.1 使用comparingByKey()

Map<String, Integer> map = new HashMap<>();
map.put("Orange", 2);
map.put("Apple", 5);
map.put("Banana", 3);// 按鍵的自然順序(字母順序)排序
List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
entries.sort(Map.Entry.comparingByKey());// 結果: Apple=5, Banana=3, Orange=2

2.2 使用comparingByValue()

// 按值的自然順序(數值大小)排序
entries.sort(Map.Entry.comparingByValue());// 結果: Orange=2, Banana=3, Apple=5

3. 方法重載版本

這兩個方法都有重載版本,允許傳入自定義Comparator:

comparingByKey(Comparator)

public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp)

comparingByValue(Comparator)

public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp)

4. 高級用法示例

4.1 逆序排序

// 按鍵逆序排序
entries.sort(Map.Entry.comparingByKey(Comparator.reverseOrder()));// 結果: Orange=2, Banana=3, Apple=5// 按值逆序排序
entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));// 結果: Apple=5, Banana=3, Orange=2

4.2 自定義比較邏輯

// 按鍵長度排序
entries.sort(Map.Entry.comparingByKey(Comparator.comparing(String::length)));// 按值的絕對值排序(假設值為Integer)
Map<String, Integer> numbers = Map.of("a", -3, "b", 2, "c", -5);
numbers.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.comparingInt(Math::abs))).forEach(System.out::println);

4.3 鏈式比較

// 先按值比較,值相同再按鍵比較
Comparator<Map.Entry<String, Integer>> comparator = Map.Entry.<String, Integer>comparingByValue().thenComparing(Map.Entry.comparingByKey());entries.sort(comparator);

5. 與Collections.max/min結合使用

Map<String, Integer> map = ...;// 找出值最大的條目
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()
);// 找出鍵最小的條目
Map.Entry<String, Integer> minKeyEntry = Collections.min(map.entrySet(),Map.Entry.comparingByKey()
);

6. 性能考慮

  • 這些比較器本身不執行排序,只是定義比較規則
  • 實際排序性能取決于使用的排序算法(如Collections.sort是O(n log n))
  • 對于只需要最大/最小值的情況,使用Collections.max/min更高效(O(n))

7. 實際應用場景

7.1 統計最高分學生

Map<String, Integer> studentScores = ...;
String topStudent = Collections.max(studentScores.entrySet(),Map.Entry.comparingByValue()
).getKey();

7.2 商品按價格排序

Map<String, Double> products = ...;
List<Map.Entry<String, Double>> sortedProducts = products.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toList());

7.3 單詞頻率統計

Map<String, Integer> wordFrequency = ...;
// 找出頻率最高的5個單詞
List<String> topWords = wordFrequency.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).limit(5).map(Map.Entry::getKey).collect(Collectors.toList());

8. 注意事項

  1. 空值處理

    • 默認情況下,遇到null鍵或值會拋出NullPointerException
    • 可以使用Comparator.nullsFirst()或nullsLast()處理
    entries.sort(Map.Entry.comparingByValue(Comparator.nullsFirst(Comparator.naturalOrder())));
    
  2. 不可比較元素

    • 如果鍵或值沒有實現Comparable且未提供Comparator,會拋出ClassCastException
  3. 不變性

    • 這些方法返回的Comparator是不可變的且線程安全的

9. 與相關方法的比較

方法特點適用場景
Map.Entry.comparingByKey()按鍵比較需要按鍵排序或查找
Map.Entry.comparingByValue()按值比較需要按值排序或查找
Comparator.comparing()通用比較需要自定義比較邏輯
Map.Entry.comparingByKey(Comparator)帶自定義比較器需要特殊鍵比較邏輯
Map.Entry.comparingByValue(Comparator)帶自定義比較器需要特殊值比較邏輯

10. 總結

Map.Entry.comparingByValue()Map.Entry.comparingByKey()是Java 8中處理Map排序和查找的利器:

  1. 代碼簡潔:避免了手動實現Comparator的繁瑣
  2. 可讀性強:方法名直接表達了比較的意圖
  3. 靈活組合:可以與thenComparing等組合實現復雜比較邏輯
  4. 性能良好:與手動實現的Comparator性能相當

掌握這兩個方法可以顯著提高處理Map集合的效率和代碼質量,特別是在需要排序或查找最大/最小元素的場景中。

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

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

相關文章

Mac下載mysql

安裝 brew list --versions | grep mysql查看已安裝的mysql版本brew search mysql查看支持的mysql版本brew info mysql查看mysql版本信息brew install mysql進行安裝/opt/homebrew/opt/mysql/bin/mysqld --initialize-insecure --user$(whoami) --basedir$(brew --prefix mysql…

PageHelper使用說明文檔

文章目錄一、簡介二、集成步驟三、使用方法四、注意事項五、高級用法一、簡介 PageHelper 是一個開源的 MyBatis 分頁插件&#xff0c;它可以幫助我們在使用 MyBatis 進行數據庫操作時方便地實現分頁功能。通過簡單的配置和少量的代碼修改&#xff0c;就可以在查詢數據時實現分…

grpo nl2sql qwen3 模型強化學習訓練有效果的成立條件有哪些

在使用GRPO&#xff08;強化學習算法&#xff09;對Qwen3模型在NL2SQL&#xff08;自然語言到SQL轉換&#xff09;任務上進行強化學習&#xff08;RL&#xff09;訓練時&#xff0c;其效果成立的核心條件可歸納為以下幾個關鍵維度&#xff0c;這些條件相互關聯&#xff0c;共同…

面向向量檢索的教育QA建模:九段日本文化研究所日本語學院的Prompt策略分析(6 / 500)

面向向量檢索的教育QA建模&#xff1a;九段日本文化研究所日本語學院的Prompt策略分析&#xff08;6 / 500&#xff09; 系列說明 500 所日本語言學校結構化建模實戰&#xff0c;第 6 篇。每篇拆解 1 所學校在 Prompt-QA 系統中的建模策略&#xff0c;分享工程經驗&#xff0c;…

墨刀原型圖的原理、與UI設計圖的區別及轉換方法詳解-卓伊凡|貝貝

墨刀原型圖的原理、與UI設計圖的區別及轉換方法詳解-卓伊凡|貝貝最近有個設計由于時間比較倉促直接用 原型做的&#xff0c;但是原型做的大家都知道是沒法用的&#xff0c;以下講解原型和ui的區別&#xff0c;其次我們下面有三種方法把墨刀的原型變成UI圖。一、墨刀原型圖的原理…

前端 nodejs vue2 開發環境和微信開發環境 故障終極處理

現象某個vue2舊項目 引入vue-ls 組件等組件&#xff0c;沖突失敗后刪除,導致開發環境 vxe-table加載失敗&#xff0c;還原后還是不行。前段項目崩潰。報警sass 某個方法 Deprecated &#xff0c;之前不會處理方式_失敗回退代碼項目代碼 刪除 node_modules&#xff0c; 刪除 …

【后端】.NET Core API框架搭建(9) --配置使用Log4Net日志

目錄 1.添加包 2.新建公用類 3.新建配置 4.注冊 4.1.類庫項目設置 5.使用 在 .NET Core 項目中使用 Log4Net 做日志記錄&#xff0c;具有很多優勢。盡管 .NET Core 自帶了 ILogger 接口&#xff08;如使用內置的 ConsoleLogger、DebugLogger 等&#xff09;&#xff0c;但…

Agent交互細節

本文參考了https://www.bilibili.com/video/BV1v9V5zSEHA/視頻及原作者代碼實踐 本文主要實踐在第3節1、MCP MCP官方地址&#xff1a;https://modelcontextprotocol.io/introduction MCP 是一個開放協議&#xff0c;它規范了應用程序向 LLM 提供上下文的方式。 架構&#xff1a…

AI+醫療!VR和MR解剖學和針灸平臺,智能時代如何重塑健康未來

在智能時代&#xff0c;“AI醫療”正從精準診斷入手&#xff0c;推動醫療系統變革&#xff0c;通過個性化健康管理、智能診療輔助等方式重塑健康未來&#xff01;將人工智能&#xff08;AI&#xff09;與虛擬實境&#xff08;VR&#xff09;應用到中醫教學&#xff0c;透過該系…

Sersync和Rsync部署

學習參考連接 以下是我在學習過程中借鑒的經驗和下載資源鏈接&#xff0c;感謝幾位大佬的幫助&#xff0c;也供各位參考。 Rsync踩坑&#xff1a; https://blog.csdn.net/XiaoXiaoYunXing/article/details/120160395 Sersync下載源 http://down.whsir.com/downloads/sersy…

Django基礎(四)———模板常用過濾器

前言上篇文章給大家介紹了DTL模板的部分知識點這篇文章繼續帶大家深入理解Django框架中的模板過濾器一、模板常用過濾器1.add將傳進來的參數添加到原來的值上面。這個過濾器會嘗試將值和 參數轉換成整形然后進行相加。如果轉換成整形過程中失敗了&#xff0c;那么會將值和參數進…

國內MCP服務器搜索引擎有哪些?MCP導航站平臺推薦

在人工智能技術蓬勃發展的今天&#xff0c;AI模型與外部工具和服務的交互能力正成為推動技術進步的關鍵。AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;作為一個專注于MCP(Model Context Protocol&#xff0c;模型上下文協議)服務器的集合平臺&#xff0c;為全…

Python中with的作用和用法

在這里我們來詳細解釋一下Python中非常重要的 with 語句。 我會從 “為什么需要它” 開始&#xff0c;然后講解 “它是什么以及如何使用”&#xff0c;最后深入到 “它的工作原理” 和 “如何自定義”。1. 為什么需要 with 語句&#xff1f;(The Problem) 在編程中&#xff0c;…

緩存雪崩、緩存穿透,緩存擊穿

Redis是一個完全開源免費的高性能非關系型&#xff08;NOSQL&#xff09;的key-value數據庫。 Redis不可能把所有的數據都緩存起來(內存昂貴且有限)&#xff0c;所以Redis需要對數據 設置過期時間&#xff0c;并采用的是惰性刪除定期刪除兩種策略對過期鍵刪除。Redis對過期鍵的…

springmvc跨域解決方案

在Spring MVC中處理跨域請求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;通常涉及到配置HTTP響應頭&#xff0c;以允許來自不同源的請求。Spring MVC提供了多種方式來配置CORS&#xff0c;包括全局配置和局部配置。 使用CrossOrigin注解 在控制器的…

btstack移植之安全配對(二)

3.13.3 Legacy配對首先&#xff0c;我們回復的paring response中&#xff0c;可以看到我們不支持secure connection&#xff0c;所以我們走的是legacy配對模式。圖3-74 secure連接不支持然后&#xff0c;master在pairing confirm包中回復了confirm value。圖3-75 master發送con…

FRP配置( CentOS 7 上安裝 FRP教程 )

** 如果你們公司沒有公網IP&#xff0c;但是又想實現內網穿透&#xff0c;遠程調用接口&#xff0c;在家也能調用公司服務器&#xff0c;但是nkg ssl有問題&#xff0c;花生殼坑壁&#xff0c;那么FRP是你最佳的選擇&#xff01;&#xff01;&#xff01;** 不過有個前提&#…

第三次mysql作業

建立庫建立mydb11_syu庫2.創建s表&#xff0c;創建sc表二&#xff0e;插入數據向s表插入數據2.向sc表插入數據三&#xff0e;查詢1.分別查詢student表和score表的所有記錄2.查詢student表的第2條到5條記錄3.從student表中查詢計算機系和英語系的學生的信息4.從student表中查詢年…

不同場景下git指令的搭配

添加賬號 git config --global user.name "YourName" git config --global user.email "your_emailexample.com"設置 Git 默認分支名稱為 main&#xff1a; git config --global init.defaultBranch main初始化倉庫&#xff1a; git init配置SSH 密鑰 如果…

NLP——遷移學習

一、遷移學習的概念 1.預訓練模型(Pretrained model) 定義: 簡單來說別人訓練好的模型。一般預訓練模型具備復雜的網絡模型結構&#xff1b;一般是在大量的語料下訓練完成的。 2.微調(Fine-tuning) 定義:一般是對預訓練語言模型&#xff0c;進行垂直領域數據的微調&#xff0c;…