使用Collections.max比較Map<String, Integer>中的最大值

文章目錄

  • 使用Collections.max比較Map<String, Integer>中的最大值
    • 基本方法
      • 1. 比較Map的值
      • 2. 比較Map的鍵
    • 自定義比較器
      • 1. 按值降序排列
      • 2. 復雜比較邏輯
    • 完整示例代碼
    • 性能考慮
    • 替代方案
      • 1. 使用Stream API (Java 8+)
      • 2. 手動遍歷
    • 實際應用場景
    • 注意事項
    • 總結


使用Collections.max比較Map<String, Integer>中的最大值

Collections.max()方法可以用來從Map中找出值最大的條目。本文將詳細介紹如何對Map<String, Integer>使用這個方法,包括基本用法、自定義比較器以及性能考慮等方面。

基本方法

1. 比較Map的值

Map<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 5);
map.put("Orange", 15);// 獲取值最大的條目
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()
);System.out.println("最大值的鍵: " + maxEntry.getKey()); // Orange
System.out.println("最大值: " + maxEntry.getValue());   // 15

2. 比較Map的鍵

// 獲取鍵最大的條目(按字母順序)
Map.Entry<String, Integer> maxKeyEntry = Collections.max(map.entrySet(),Map.Entry.comparingByKey()
);System.out.println("最大鍵: " + maxKeyEntry.getKey()); // Orange

自定義比較器

1. 按值降序排列

Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(),Map.Entry.comparingByValue(Comparator.reverseOrder())
);

2. 復雜比較邏輯

// 先按值比較,值相同再按鍵比較
Comparator<Map.Entry<String, Integer>> comparator = Comparator.comparing(Map.Entry<String, Integer>::getValue).thenComparing(Map.Entry::getKey);Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(),comparator
);

完整示例代碼

import java.util.*;public class MapMaxExample {public static void main(String[] args) {Map<String, Integer> fruitPrices = new HashMap<>();fruitPrices.put("Apple", 100);fruitPrices.put("Banana", 80);fruitPrices.put("Orange", 120);fruitPrices.put("Mango", 120); // 與Orange同價// 1. 簡單按值比較Map.Entry<String, Integer> maxByValue = Collections.max(fruitPrices.entrySet(),Map.Entry.comparingByValue());System.out.println("最貴的水果(僅按價格): " + maxByValue.getKey() + " - " + maxByValue.getValue());// 2. 按值比較,值相同按鍵比較Map.Entry<String, Integer> maxByValueThenKey = Collections.max(fruitPrices.entrySet(),Comparator.comparing(Map.Entry<String, Integer>::getValue).thenComparing(Map.Entry::getKey));System.out.println("最貴的水果(價格相同按字母順序): " + maxByValueThenKey.getKey() + " - " + maxByValueThenKey.getValue());// 3. 按鍵長度比較Map.Entry<String, Integer> maxByKeyLength = Collections.max(fruitPrices.entrySet(),Comparator.comparing(entry -> entry.getKey().length()));System.out.println("名稱最長的水果: " + maxByKeyLength.getKey() + " - " + maxByKeyLength.getValue());}
}

性能考慮

  1. 時間復雜度:O(n),需要遍歷整個entrySet
  2. 空間復雜度:O(1),不需要額外空間

對于大型Map,這種方法是高效的,因為它只需要一次遍歷。

替代方案

1. 使用Stream API (Java 8+)

// 按值找最大
Optional<Map.Entry<String, Integer>> maxEntry = map.entrySet().stream().max(Map.Entry.comparingByValue());

2. 手動遍歷

Map.Entry<String, Integer> maxEntry = null;
for (Map.Entry<String, Integer> entry : map.entrySet()) {if (maxEntry == null || entry.getValue() > maxEntry.getValue()) {maxEntry = entry;}
}

實際應用場景

  1. 找出最高分學生

    Map<String, Integer> studentScores = ...;
    Map.Entry<String, Integer> topStudent = Collections.max(studentScores.entrySet(),Map.Entry.comparingByValue()
    );
    
  2. 統計最熱門商品

    Map<String, Integer> productSales = ...;
    Map.Entry<String, Integer> bestSeller = Collections.max(productSales.entrySet(),Map.Entry.comparingByValue()
    );
    
  3. 尋找最長名稱的鍵

    Map.Entry<String, Integer> longestName = Collections.max(map.entrySet(),Comparator.comparing(entry -> entry.getKey().length())
    );
    

注意事項

  1. 空Map處理

    if (!map.isEmpty()) {Map.Entry<String, Integer> max = Collections.max(...);
    } else {// 處理空Map情況
    }
    
  2. null值處理

    • Map的值或鍵為null可能導致NullPointerException
    • 可以使用Comparator.nullsFirst()或nullsLast()處理
  3. 并發修改

    • 如果在遍歷過程中Map被修改,可能拋出ConcurrentModificationException

總結

使用Collections.max()配合Map.Entry.comparingByValue()或自定義比較器,是從Map中找出最大值條目的簡潔高效方法。相比手動遍歷,這種方法:

  1. 代碼更簡潔
  2. 可讀性更好
  3. 易于維護
  4. 性能相同

對于Java 8及以上版本,也可以考慮使用Stream API實現類似功能,但Collections.max()仍然是處理這類問題的經典解決方案。

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

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

相關文章

鴻蒙狀態欄操作

1.鴻蒙設備基礎信息 1.1圖解 1.1窗口內容規避區域 AvoidArea7 窗口內容規避區域。 窗口內容規避區域。如系統欄區域、劉海屏區域、手勢區域、軟鍵盤區域等與窗口內容重疊時&#xff0c;需要窗口內容避讓的區域。在規避區無法響應用戶點擊事件。 除此之外還需注意規避區域的如…

Product Hunt 每日熱榜 | 2025-07-17

1. Brain MAX by ClickUp 標語&#xff1a;一款AI應用統治一切&#xff1a;你的知識 語音轉文字 介紹&#xff1a;Brain MAX 是 ClickUp 完全原生的桌面應用&#xff0c;旨在提升生產力&#xff0c;幫助你擺脫 AI 的雜亂無章。只需每月 9 美元&#xff0c;就可以使用所有的 …

如何使用VScode使用ssh連接遠程服務器不需要輸入密碼直接登錄

ssh-keygen 之后一直默認 回車 確認即可結果 (base) amaxamax:/data/std$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/amax/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:…

vue實現el-table-column中自定義label

vue實現el-table-column中自定義label<el-table-columnlabel"操作"align"left"width"50"><template #header><div><el-buttonsize"mini"type"primary"icon"el-icon-plus"circle></el-…

Vue 常用的 ESLint 規則集

對Vue項目來說&#xff0c;Vue 官方通過 eslint-plugin-vue 提供了多個規則集&#xff08;Rule Sets&#xff09;&#xff0c;適用于不同嚴格度和 Vue 版本。以下是主要的規則集及其對應的 ESLint 插件和用途&#xff1a; 1. Vue 2.x 規則集 適用于 Vue 2 項目&#xff0c;規則…

AbMole小課堂 | Angiotensin II(血管緊張素Ⅱ)在心血管研究中的多元應用

Angiotensin II&#xff08;血管緊張素Ⅱ&#xff0c;AbMole&#xff0c;M6240&#xff09;是一種血管收縮劑&#xff0c;也是腎素-血管緊張素系統 (RAS) 的主要效應肽。Angiotensin II參與動物的血壓調節、水電解質平衡等經典生理過程在科研中Angiotensin II被廣泛用于動物心血…

【Unity】Mono相關理論知識學習

一種編譯技術。優點&#xff1a;支持JIT編譯&#xff1a;在運行時將IL編譯成機器碼。首次執行稍慢&#xff0c;好處在于運行更快&#xff0c;迭代更高效。構建速度快&#xff1a;無需將IL轉成C&#xff0c;構建過程省去了IL2CPP的轉換和原生編譯步驟&#xff0c;適合開發階段快…

React源碼4 三大核心模塊之一:Schedule,scheduleUpdateOnFiber函數

scheduler工作階段在React內部被稱為schedule階段。在《React源碼3》&#xff0c;我們已經將update加入隊列并返回到了根容器節點root。function updateContainer(element, container, parentComponent, callback) {//前面略過var root enqueueUpdate(current$1, update, lane…

Unity3D + VS2022連接雷電模擬器調試

本文參考了Unity3D Profiler 連接真機和模擬器_unity 連接雷電模擬器-CSDN博客 具體步驟&#xff1a; 1、cmd打開命令窗口&#xff0c;輸入adb devices&#xff0c;確認能檢測到模擬器 示例&#xff1a;List of devices attached emulator-5554 device 2、…

學習軟件測試的第十五天

1.會寫測試用例嗎&#xff1f;測試用例有什么要素“會的&#xff0c;我寫過多個功能測試和接口測試的測試用例。我寫用例的時候會根據需求文檔或原型圖分析測試點&#xff0c;然后從正常流程、異常流程、邊界情況等方面設計測試場景。每條用例我都會包含&#xff1a;用例編號、…

C++硬實時調度:原理、實踐與最佳方案

在工業自動化、航空航天、醫療設備等領域&#xff0c;系統的實時性往往直接關系到生命安全和財產損失。C作為高性能編程語言&#xff0c;為硬實時系統開發提供了強大支持。本文將深入探討C硬實時調度的核心技術&#xff0c;從操作系統原理到代碼實現的全方位解析。 一、實時系統…

LeetCode 1156.單字符重復子串的最大長度

如果字符串中的所有字符都相同&#xff0c;那么這個字符串是單字符重復的字符串。 給你一個字符串 text&#xff0c;你只能交換其中兩個字符一次或者什么都不做&#xff0c;然后得到一些單字符重復的子串。返回其中最長的子串的長度。 示例 1&#xff1a; 輸入&#xff1a;text…

K近鄰算法的分類與回歸應用場景

K近鄰算法的分類與回歸應用場景 K近鄰&#xff08;K-Nearest Neighbors, KNN&#xff09;算法是一種基礎但強大的機器學習方法&#xff0c;它既可以用于分類問題&#xff0c;也能解決回歸問題。 兩者的核心思想都是基于"近朱者赤&#xff0c;近墨者黑"的原理&#xf…

算法精講--正則表達式(二):分組、引用與高級匹配技術

算法精講–正則表達式&#xff08;二&#xff09;&#xff1a;分組、引用與高級匹配技術 &#x1f680;正則表達式的真正力量在于組合使用各種語法元素&#xff0c;創造出強大而精確的匹配模式&#xff01; —— 作者&#xff1a;無限大 推薦閱讀時間&#xff1a;25 分鐘 適用人…

python+requests 接口自動化測試實戰

首先介紹一下python的requests模塊&#xff1a; requests的使用介紹&#xff1a;requests快速入門 Python結合requests庫實現接口自動化測試環境說明&#xff1a; 1.WIN 7, 64位 2.Python3.4.3 &#xff08;pip-8.1.2&#xff09; 3.Requests —>pip install requests 4.U…

NAT 實驗

NAT 實驗 一.實驗拓撲圖實驗目的 1.按照圖示配置 IP 地址 2.私網 A 通過 R1 接入到互聯網&#xff0c;私網 B 通過 R3 接入到互聯網 3.私網 A 內部存在 Vlan10 和 Vlan20&#xff0c;通過 R1 上單臂路由訪問外部網絡 4.私網 A 通過 NAPT 使 Vlan10 和 Vlan20 都能夠使用 R1 的公…

buuctf——web刷題第三頁

第三頁 目錄 [FBCTF2019]RCEService [0CTF 2016]piapiapia [Zer0pts2020]Can you guess it? [WUSTCTF2020]顏值成績查詢 [SUCTF 2019]Pythonginx [MRCTF2020]套娃 [CSCCTF 2019 Qual]FlaskLight [watevrCTF-2019]Cookie Store [WUSTCTF2020]CV Maker [紅明谷CTF 202…

前后端分離項目中的接口設計與調用流程——以高仙機器人集成為例

一、背景介紹在前后端分離項目開發中&#xff0c;前端頁面需要頻繁調用后端接口獲取數據。在高仙機器人對接項目中&#xff0c;我們采用了若依&#xff08;RuoYi&#xff09;框架&#xff0c;前端通過統一的 API 封裝與后端進行數據交互&#xff0c;而后端再對接高仙官方的 OPE…

【第五節】部署http接口到ubuntu server上的docker內

描述清楚需求&#xff0c;讓deepseek幫我們寫一個demo&#xff0c;文件結構如下 FLASK_API_001 ├── app.py └── Dockerfile └── requirements.txtapp.pyfrom flask import Flask, jsonify, requestapp Flask(__name__)# 根路由 app.route(/) def home():return "…

在 IntelliJ IDEA 中添加框架支持的解決方案(沒有出現Add Framework Support)

在 IntelliJ IDEA 中添加框架支持的解決方案 問題背景 版本變化&#xff1a;在 IntelliJ IDEA 2023.2 及更高版本中&#xff0c;項目右鍵菜單中的 “Add Framework Support” 選項已被移除。 常見需求&#xff1a;為 Java 項目添加框架支持&#xff08;如 Maven、Spring 等&am…