Java零基礎手把手系列:HashMap排序方法一網打盡


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

小伙伴們,要不也給一個贊吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM