Java中的Map集合根據(jù)key值排序的實現(xiàn)
Map集合的鍵(key)默認是按照它們的hashCode排序的,這在有時間不符合業(yè)務(wù)排序。如果你想要根據(jù)Map的key值進行排序,一般以下有幾種方法可以實現(xiàn)。
方法一:使用TreeMap
使用TreeMap類,它會自動根據(jù)key的自然順序或自定義比較器進行排序。
1、使用key(String)的自然排序:
代碼示例:
// 假設(shè)Map為HashMap Map<String, Integer> unsortedMap = new HashMap<>(); // 添加元素到unsortedMap unsortedMap = ... ; // 使用TreeMap進行排序 Map<String, Integer> sortedMap = new TreeMap<>(unsortedMap);
2、使用自定義規(guī)則排序,傳入Comparator自定義排序規(guī)則:
// 假設(shè)為HashMap<String, Object> map // 未排序的HashMap Map<String, Object> unSortMap = ...; // 使用TreeMap并提供一個Comparator用于排序key Map<String, Object> sortedMap = new TreeMap<>(new Comparator<String>() { @Override public int compare(String k1, String k2) { // 對于字符串key升序排序 return k1.compareTo(k2); // 若需要降序排序,則可以改為 // return k2.compareTo(k1); } }); // 將原始Map的內(nèi)容復(fù)制到TreeMap中,此時Map會根據(jù)key排序 sortedMap.putAll(unSortMap );
方法二:使用lambda表達式和Stream流簡化操作
示例代碼:
// 按照key 升序排序 Map<String, Object> sortedMap = unSortMap.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, // 解決可能存在的鍵沖突問題,默認保留第一個值 (oldValue, newValue) -> oldValue, // 提供一個新的TreeMap實例作為收集器,用于保持排序 () -> new TreeMap<>() )); // 或者,如果要降序排序 Map<String, Object> sortedMapDescending = originalMap.entrySet().stream() .sorted(Map.Entry.<String, Object>comparingByKey().reversed()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, // 處理鍵沖突 (oldValue, newValue) -> oldValue, () -> new TreeMap<>() ));
注意:此處不論方法一、方法二,對于Map中key為String類型的數(shù)據(jù),都是底層都是按照字典順序進行排序的。
所以一旦有一些特殊要求的排序:
例如:key為:“123-234”,“2134-1234”,“2-123”,
需要根據(jù)key排序為: “2-123”,“123-234”,“2134-1234”時,就需要重新書寫自定義的排序方法 或者 考慮其他的方式實現(xiàn)指定key排序了。
討論一下: 上面key值的Map該如何排序:
// 例:“2-123”,“123-234”,“2134-1234” Map<String, Object> unSortMap = new HashMap(); map.put("123-234","2"); map.put("2-123","1"); map.put("2134-1234","3"); // 使得unSortMap 按照key值為“2-123”,“123-234”,“2134-1234”進行排序
到此這篇關(guān)于Java中的Map集合根據(jù)key值排序的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java中Map根據(jù)key值排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合SpringSession實現(xiàn)分布式登錄詳情
這篇文章主要介紹了SpringBoot整合SpringSession實現(xiàn)分布式登錄詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08java 將數(shù)據(jù)加載到內(nèi)存中的操作
這篇文章主要介紹了java 將數(shù)據(jù)加載到內(nèi)存中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09關(guān)于SpringCloud整合RabbitMQ的實例
這篇文章主要介紹了關(guān)于SpringCloud整合RabbitMQ的實例,消息隊列是指利用高效可靠的消息傳遞機制進行與平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下2023-07-07談?wù)凷pring AOP中@Aspect的高級用法示例
在Spring AOP中目前只有執(zhí)行方法這一個連接點,下面這篇文章主要給大家介紹了關(guān)于Spring AOP中@Aspect的高級用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Java FineReport報表工具導(dǎo)出EXCEL的四種方式
這篇文章主要介紹了Java FineReport報表工具導(dǎo)出EXCEL的四種方式的相關(guān)資料,需要的朋友可以參考下2016-03-03