HashMap的排序在一開始學習Java的時候,比較容易暈,今天總結了一些常見的方法,一網打盡。HashMap的排序入門,看這篇文章就夠了。
1. 概述
本文排序HashMap的鍵(key)和值(value)使用的方法如下:
TreeMapArrayList 和 Collections.sort()TreeSet使用 the Stream API為了排序,我們先構造一個簡單的HashMap,如下:
Map<String, Integer> unsortMap = new HashMap<>(); unsortMap.put("key3", 5); unsortMap.put("key2", 4); unsortMap.put("key1", 3); unsortMap.put("key4", 2); unsortMap.put("key5", 1);
2. 使用TreeMap
第一種辦法,利用TreeMap排序。Java裡面實現TreeMap的默認邏輯是有序的:
插入到TreeMap的數據會按照Key排序。
所以這個是一個簡單有效的辦法,使用TreeMap排序HashMap。只需要一句話:
TreeMap<String,Integer>sorted=newTreeMap<>(map);System.out.println(sorted);
輸出是:
{key1=3,key2=4,key3=5,key4=2,key5=1}
3. 使用ArrayList
我們也可以使用ArrayList來輔助排序,和前文不一樣的是:這裡ArrayList只能按照Key或者Value排序
3.1 Sort by Key
使用ArrayList來輔助進行Key的排序:只需要從Map中獲取到Key的集合,構造List即可,然後使用Collections的自帶方法sort來排序,來看代碼:
List<String>sorted=newArrayList<>(map.keySet());Collections.sort(sorted);
輸出:
[key1,key2,key3,key4,key5]
然後我們可以遍歷排好序的List,從map裡面拿出相應的Values,這裡就不寫了,有興趣的小夥伴可以親自試試。
3.2 Sort by Value
同樣地,我們可以使用HashMap的方法values(),取出所有的Value集合構造List,然後使用Collections.sort排序,代碼如下:
List<String>sorted=newArrayList<>(map.values());Collections.sort(sorted);
輸出:
[1,2,3,4,5]
4. 使用TreeSet
有時候HashMap裡面存儲的對象,可能有重複的,比如:有一個學生(年齡=28,名字=小紅),排序的時候期望去掉這些重複的值,可以使用TreeSet。
Set是一種容器,裡面存儲的數據都是唯一的,不會重複
這裡使用辦法很簡單,也是構造一個TreeSet,類似ArrayList傳入Key的集合或者Values的集合即可:
SortedSet<Integer>valueSorted=newTreeSet<>(map.values());或者SortedSet<String>keySorted=newTreeSet<>(map.keySet());
後續講了類的基本概念,來實現一個可去重的排序。
5. 使用Lambdas和Streams
如果我們使用的是JDK 1.8以上,推薦使用Lambdas表達式和Stream API排序
我們要做的事情很簡單:就是構造Steam流,傳入要排序的Compare就可以了,而且Compare也不需要我們自己寫,Java裡面自帶。 可以先不關注什麼是Lambdas表達式,後面我們再來講,現在只需要知道如何用來排序就好.
5.1 Sort by Key
首先使用entrySet.stream構造流pipeline,然後調用sorted函數傳入內置的Compare,就大公告成了,如下:
map.entrySet().stream().sorted(Map.Entry.<String,Integer>comparingByKey()).forEach(System.out::println);
輸出:
key1=3key2=4key3=5key4=2key5=1
5.2 Sort by Value
類似地,如果要按照Value排序,只需要傳入內置Compare:comparingByValue即可
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
輸出:
!!!使用Steam和Lambdas表達的方法,強烈推薦!!!
6. 總結
終於大功告成了,手都給敲累了,不容易啊。今天總結了幾種常見的HashMap的排序辦法,還有一個問題:如果是我們自己構造的類,如何排序呢?這個就是要實現Comparable接口,然後重寫裡面的比較邏輯,等後面我們講了類的基礎,再細講。
今天的代碼,關注「寫bug咯」,後臺回復「HashMap」,即可獲得。