HashMap的排序在一開始學習Java的時候,比較容易暈,今天總結了一些常見的方法,一網打盡。HashMap的排序入門,看這篇文章就夠了。
1. 概述
本文排序HashMap的鍵(key)和值(value)使用的方法如下:
- TreeMap
- ArrayList 和 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 = new TreeMap<>(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 = new ArrayList<>(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 = new ArrayList<>(map.values()); Collections.sort(sorted);
輸出:
[1, 2, 3, 4, 5]
4. 使用TreeSet
有時候HashMap里面存儲的對象,可能有重復的,比如:有一個學生(年齡=28,名字=小紅),排序的時候期望去掉這些重復的值,可以使用TreeSet。
Set是一種容器,里面存儲的數據都是唯一的,不會重復
這里使用辦法很簡單,也是構造一個TreeSet,類似ArrayList傳入Key的集合或者Values的集合即可:
SortedSet<Integer> valueSorted = new TreeSet<>(map.values()); 或者 SortedSet<String> keySorted = new TreeSet<>(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=3
key2=4
key3=5
key4=2
key5=1
5.2 Sort by Value
類似地,如果要按照Value排序,只需要傳入內置Compare:comparingByValue即可
map.entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .forEach(System.out::println);
輸出:
key5=1
key4=2
key1=3
key2=4
key3=5
!!!使用Steam和Lambdas表達的方法,強烈推薦!!!
6. 總結
終於大功告成了,手都給敲累了,不容易啊。
今天總結了幾種常見的HashMap的排序辦法,還有一個問題:如果是我們自己構造的類,如何排序呢?
這個就是要實現Comparable接口,然后重寫里面的比較邏輯,等后面我們講了類的基礎,再細講。
今天的代碼,關注VX公號“寫bug咯”,后台回復“hashmap”,即可獲得。
可以添加博主vx交流:crazy042438
小伙伴們,要不也給一個贊吧。