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

2020-12-24 CoderStudio

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」,即可獲得。

相關焦點

  • 快速弄懂hashmap主要方法實現
    Node<K,V>的結構是實現hashmap的關鍵,後面講解的幾個重要方法會有所體現!put方法hashmap最難的方法之一就是put方法了,我們直接看源碼,附上簡單解讀如下圖:方法的主要流程已經截取如上圖了,並且附上了幾乎每一個的解讀,知道了每一步都在做什麼,就可以梳理put方法的流程了,流程圖如下圖:可能看起來有一點點複雜
  • 零基礎學習Java者必須了解的Java語言常識以及知識
    針對零基礎的初學者,入門Java語言你就必須了解一些常識知識。Java簡介Java是由Sun Microsystems公司於1995年5月推出的Java面向對象程序設計語言和Java平臺的總稱。由James Gosling和同事們共同研發,並在1995年正式推出。
  • 「原創」Java並發編程系列26|ConcurrentHashMap(上)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫終於輪到ConcurrentHashMap了,並發編程必備,也是面試必備。get()方法擴容面試必備細節1.
  • 淺談Java中的hashcode方法
    下面這段代碼是java.util.HashMap的中put方法的具體實現:public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry
  • 「原創」JVM系列03|Java棧—方法是如何調用的?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是何適 JVM 修仙系列第 3 篇,文末有本系列文章匯總。舉例說明:方法1中調用方法2,方法2中調用方法3,方法3中調用方法4,當執行到方法4時,棧內存結構如下圖:舉例模擬棧溢出:因為每次方法調用都會生成一個棧幀,當函數調用數量很大,生成的棧幀內存超過 Java 棧總內存時,就會棧溢出 StackOverflowError
  • JAVA基礎知識系列---進程、線程安全
    1.5 重排序編譯器和處理器為了提高性能,而在程序執行時會對程序進行重排序。他的出現是為了提高程序的並發度。從而提高性能;但是對於多線程程序,重排序可能會導致程序執行的結果不是我們需要的結果,重排序分為編譯器和處理器倆個方面。而處理器重排序包括指令級重排序和內存重排序。
  • java中HashMap原理?面試?你是誰,你在哪?
    當我們給put()方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,計算並返回的hashCode是用於找到Map數組的bucket位置來儲存Node 對象。這裡關鍵點在於指出,HashMap是在bucket中儲存鍵對象和值對象,作為Map.Node 。
  • Java HashSet源碼分析
    原理在《Head fist java》一書中有描述:當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他加入的對象的 hashcode 值作比較,如果沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。
  • Java基礎面試題簡單總結
    中的保留字,現在沒有在java中使用11、數組有沒有length()這個方法?面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。
  • Arrays.sort() 為什麼可以對 int 等數組進行排序?我跟面試官扯了...
    是不是發現了都實現了Comparable接口和compareTo方法。對,你現在也許知道怎麼去回答面試官這個問題了,因為他們都實現了Comparable接口和compareTo方法。3、試試真是如此嗎?不信測試一下新建二個實體類和一個測試類,一個是Student實體類,一個是User實體類,一個是測試類Test。
  • java常用幾大類庫
    java.lang下的類不需要導包,其他需要。 看類的解釋和說明。 學習構造方法。 使用成員方法。為了解決這個問題,Java提供了另一個容器 java.util.ArrayList 集合類,讓我們可以更便捷的存儲和操作對象數據。4.2 什麼是ArrayList類java.util.ArrayList 是大小可變的數組的實現,存儲在內的數據稱為元素。此類提供一些方法來操作內部存儲的元素。
  • Java:按值對map進行排序
    在Java中,我們可以使用TreeMap該類通過其鍵對地圖進行排序。該類非常易於使用。但是,有時我們需要按其值對map進行排序。如何通過其值對映射進行排序是Java程式設計師最常問的問題。在本文中,我將開發編寫這種方法的最佳方法。
  • Java 中 Comparable 和 Comparator 比較
    本文,先介紹Comparable 和Comparator兩個接口,以及它們的差異;接著,通過示例,對它們的使用方法進行說明。Comparable 簡介Comparable 是排序接口。若一個類實現了Comparable接口,就意味著「該類支持排序」。
  • java.util.Scanner的幾種next方法
    java.util.Scanner,這個類,想必大家都不怎麼陌生,在初學Java這門程式語言時,都見過,使用過吧。今天就來說說java.util.Scanner類的幾種next方法。scanner.nextBigDecimal()方法如果想要通過java.util.Scanner來獲取一個輸入的BigDecimal對象,則可以使用類似下面示例的代碼。
  • 來複習一波,HashMap底層實現原理解析
    如果這個位置上有單向鍊表,那麼它就會拿著參數K和單向鍊表上的每一個節點的K進行equals,如果所有equals方法都返回false,則get方法返回null。如果其中一個節點的K和參數K進行equals返回true,那麼此時該節點的value就是我們要找的value了,get方法最終返回這個要找的value。
  • Java面試題參考答案I
    ②equals:存在於Object的方法,用於兩個對象按用戶定義的方法判斷是 否相等,若是類中未重寫此方法,則與==用法相同③hashcode:存在於Object的方法,用於提高查找的快捷性,因為hashCode 也是在Object對象中就有的,所以所有Java對象都有hashCode, 在HashTable
  • 基礎不牢地動山搖記住 Java 面試中常用的八種排序算法與代碼實現
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1.直接插入排序經常碰到這樣一類排序問題:把新的數據插入到已經排好的數據列中。
  • 黑馬程式設計師Java教程:Java基礎教程之MAP集合
    Java提供了專門的集合類用來存放這種對象關係的對象,即java.util.Map接口。我們通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同,如下圖。
  • mysql 002|order by的排序算法竟然是這樣的!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言平常寫業務的時候,我們經常需要對一些業務數據進行排序了解完了這個參數值,我們可以介紹兩種排序流程:一次排序二次排序一次排序不是一個專業術語,按照我的理解來解讀,排序流程需要一次讀取磁碟
  • 跟我學Java編程—應用自動排序的TreeMap
    前面介紹了Map接口的實現類LinkedHashMap,LinkedHashMap存儲的元素是有序的,可以保持元素的插入順序,但不能對元素進行自動排序。在一些編程應用場景中,如果在數據的存儲過程中,能夠自動對數據進行排序,將會極大提高編程效率,程式設計師無需再為數據排序編寫必要的代碼。