Java面試題:如何對HashMap按鍵值排序

2021-03-06 動力節點Java學院

Java中HashMap是一種用於存儲「鍵」和「值」信息對的數據結構。不同於Array、ArrayList和LinkedLists,它不會維持插入元素的順序。

因此,在鍵或值的基礎上排序HashMap是一個很難的面試問題,如果你不知道如何解決的話。下面讓我們看看如何解決這個問題。

1. HashMap存儲每對鍵和值作為一個Entry<K,V>對象。例如,給出一個HashMap,

Map<String,Integer> aMap = new HashMap<String,Integer>();

鍵的每次插入,都會有值對應到散列映射上,生成一個Entry <K,V>對象。通過使用這個Entry <K,V>對象,我們可以根據值來排序HashMap。

2.創建一個簡單的HashMap,並插入一些鍵和值。

ap<String,Integer> aMap = new HashMap<String,Integer>();                aMap.put("Five", 5);        aMap.put("Seven", 7);        aMap.put("Eight", 8);        aMap.put("One",1);        aMap.put("Two",2);        aMap.put("Three", 3);

3.從HashMap恢復entry集合,如下所示。

Set<Entry<String,Integer>> mapEntries = aMap.entrySet();

4.從上述mapEntries創建LinkedList。我們將排序這個鍊表來解決順序問題。我們之所以要使用鍊表來實現這個目的,是因為在鍊表中插入元素比數組列表更快。

List<Entry<String,Integer>> aList = new LinkedList<Entry<String,Integer>>(mapEntries);

5.通過傳遞鍊表和自定義比較器來使用Collections.sort()方法排序鍊表。

Collections.sort(aList, new Comparator<Entry<String,Integer>>() {            @Override            public int compare(Entry<String, Integer> ele1,                    Entry<String, Integer> ele2) {                return ele1.getValue().compareTo(ele2.getValue());            }        });

6.使用自定義比較器,基於entry的值(Entry.getValue()),來排序鍊表。

7. ele1.getValue(). compareTo(ele2.getValue())——比較這兩個值,返回0——如果這兩個值完全相同的話;返回1——如果第一個值大於第二個值;返回-1——如果第一個值小於第二個值。

8. Collections.sort()是一個內置方法,僅排序值的列表。它在Collections類中重載。這兩種個方法是:

public static <T extends Comparable<? super T>> void sort(List<T> list)public static <T> void sort(List<T> list, Comparator<? super T> c)

9.現在你已經排序鍊表,我們需要存儲鍵和值信息對到新的映射中。由於HashMap不保持順序,因此我們要使用LinkedHashMap。

Map<String,Integer> aMap2 = new LinkedHashMap<String, Integer>();        for(Entry<String,Integer> entry: aList) {            aMap2.put(entry.getKey(), entry.getValue());        }

10.完整的代碼如下。

package com.speakingcs.maps;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class SortMapByValues {    public static void main(String[] args) {        Map<String,Integer> aMap = new HashMap<String,Integer>();                aMap.put("Five", 5);        aMap.put("Seven", 7);        aMap.put("Eight", 8);        aMap.put("One",1);        aMap.put("Two",2);        aMap.put("Three", 3);        sortMapByValues(aMap);    }    private static void sortMapByValues(Map<String, Integer> aMap) {        Set<Entry<String,Integer>> mapEntries = aMap.entrySet();        System.out.println("Values and Keys before sorting ");        for(Entry<String,Integer> entry : mapEntries) {            System.out.println(entry.getValue() + " - "+ entry.getKey());        }                List<Entry<String,Integer>> aList = new LinkedList<Entry<String,Integer>>(mapEntries);                Collections.sort(aList, new Comparator<Entry<String,Integer>>() {            @Override            public int compare(Entry<String, Integer> ele1,                    Entry<String, Integer> ele2) {                return ele1.getValue().compareTo(ele2.getValue());            }        });                Map<String,Integer> aMap2 = new LinkedHashMap<String, Integer>();        for(Entry<String,Integer> entry: aList) {            aMap2.put(entry.getKey(), entry.getValue());        }                System.out.println("Value " + " - " + "Key");        for(Entry<String,Integer> entry : aMap2.entrySet()) {            System.out.println(entry.getValue() + " - " + entry.getKey());        }    }}

相關焦點

  • Java面試高頻考點:HashMap的底層原理
    作為一個Java開發工程師,在面試的過程中,最高頻被問到的一個問題就是:「請簡述一下HashMap的實現原理」,在日常開發中,大多數程式設計師只會使用,對於其實現細節,卻不了解,殊不知這是較基礎卻也最重要的知識點。這篇文章將向大家詳細解釋hashmap的底層到底做了哪些事情。
  • 50道Java集合經典面試題(收藏版)
    前言來了來了,50道Java集合面試題也來啦~ 已經上傳github:https://github.com/whx123/JavaHome1.Timesort排序Timsort排序是結合了合併排序(merge.sort)和插入排序(insertion sort)而得出的排序方法;1.當數組長度小於某個值,採用的是二分插入排序算法,如下:
  • 給Java程式設計師的20個鍊表面試題
    答案:http://javarevisited.blogspot.sg/2017/03/how-to-reverse-linked-list-in-java-using-iteration-and-recursion.html3. 如何刪除一個未排序鍊表中的重複節點?
  • 使用Java8 Stream API對Map類型按照鍵或值進行排序
    在這篇文章中,您將學習如何使用Java對Map按照鍵或值進行排序。前幾日有位朋友面試遇到了這個問題,看似很簡單的問題,但是如果不仔細研究一下也是很容易讓人懵圈的面試題。所以我決定寫這樣一篇文章。在Java中,有多種方法可以對Map進行排序,但是我們將重點介紹Java 8 Stream,這是實現目標的一種非常優雅的方法。
  • JAVA最常見面試題匯總!
    hashtable是做了同步的,即線程安全,hashmap未考慮同步。所以hashmap在單線程情況下效率較高。hashtable在的多線程情況下,同步操作能保證程序執行的正確性。6.進程與線程:進程值運行中的程序(獨立性,動態性,並發性),線程指進程中的順序執行流。區別是:1.進程間不共享內存 2.創建進程進行資源分配的代價要大得多,所以多線程在高並發環境中效率高。7.序列化與反序列化:序列化指將java對象轉化為字節序列,反序列化相反。主要是為了java線程間通訊,實現對象傳遞。
  • 滴滴Android崗面經分享:面試真題+經驗總結
    7.常見的排序算法,複雜度,穩定不穩定快排,堆排,桶排,插入,選擇等等8.記不清了其他的。。二面:自我介紹手撕算法題能想到的所有方法來解決數組中重複出現次數最多的元素智力題9個外觀一樣的小球,有一個比較輕,問最少需要幾次可以通過天平找到小球java多線程線程a中開啟線程b,c,d,在線程b,c,d執行結束後再結束執行線程
  • Java經典面試題答案解析(1-80題)
    在牛客網看到這道題的答案,覺得寫的最好~連結:https://www.nowcoder.com/questionTerminal/99f7d1f4f8374e419a6d6924d35d9530來源:牛客網Comparable & Comparator 都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator
  • [java大數據面試] 百度面試經過+三面算法題:給定一個數組,求和為定值的所有組合.
    我之前去美團面試從一面到hr面,總計四面 面了一下午將近四個小時...還不包括來迴路程,所以面試是項體力+腦力的活,準備的充分了,面試成功率高少跑幾次了~就會輕鬆不少~大部分同學面試面上幾家之後都懶得再跑了.
  • Java:按值對map進行排序
    在Java中,我們可以使用TreeMap該類通過其鍵對地圖進行排序。該類非常易於使用。但是,有時我們需要按其值對map進行排序。如何通過其值對映射進行排序是Java程式設計師最常問的問題。在本文中,我將開發編寫這種方法的最佳方法。
  • 經典Java面試題的答案——容器
    java.util.Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。此類不能實例化。20.List、Set、Map 之間的區別是什麼?
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    比如阿里巴巴java面經、小米java面經、網易java面經等,吸引了大多數的程式設計師們的圍觀。在分享螞蟻金服Java程式設計師面經前,不妨來看下Java程式設計師面試時要注意3大要點:0、重視基礎在面試之前,有必要將基礎的知識點重新過一遍,比如並發優缺點、內存可見性、鎖、同步、線程池框架等。
  • Java最常見600+面試題全解析:面試必備
    最近在刷面試題,所以需要看大量的Java相關的面試題,從大量的題目中總結了很多的知識,也分享給需要的同學。尚學堂與500+企業合作,建立IT行業最全的企業面試題庫。每周8~20家企業上門招聘,輕鬆掌握企業最新面試題集。本題集幾乎都是【必考題】,都能看懂的話,保你面試十拿九穩。
  • java程式設計師面試遇到string題如何不涼?
    最近看到好多同學都在儲備面試知識,以備來年輕鬆應對面試官,拿到心儀offer,之前好多同學反映遇到string,都只能送給自己一首涼涼。別涼,今天小編就為大家準備了面試中常遇到的string題,讓你輕鬆愉快拿offer~首先跟大家說說如何創建string~創建字符串較簡單的方式如下String str = "Runoob";在代碼中遇到字符串常量時,這裡的值是 "Runoob"",編譯器會使用該值創建一個 String 對象。
  • Android常識面試題,onSaveInstanceState
    ArrayMap:是一個<key,value>映射的數據結構,它設計上更多的是考慮內存的優化,內部是使用兩個數組進行數據存儲,一個數組記錄key的hash值,另外一個數組記錄Value值,它和SparseArray一樣,也會對key使用二分法進行從小到大排序,在添加、刪除、查找數據的時候都是先使用二分查找法得到相應的index,效率稿。
  • 面試前必看Java線程面試題
    下面是Java線程相關的熱門面試題,你可以用它來好好準備面試。1.面向對象的特徵有哪些方面?答:面向對象的特徵主要有以下幾個方面:- 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行為抽象兩方面。
  • 阿里java面試被pass後,奮戰1個月,最終拿下美團offer!
    ,最終拿下了美團offer,今天小編把這位小夥伴遇到的面試題分享出來,希望能對即將面試的小夥伴有所幫助。CAS 實現原理volatile 實現原理, 單例模式java 內存模型, gc 調優的經歷. cms gc 的幾個階段, 為什麼會出現 stop the world. 常見可優化參數有哪些.為什麼需要優化 gc, gc 會導致什麼問題.mysql 事務隔離級別. mvcc 實現原理mysql 索引原理.
  • 面試題之java基礎
    應部分網友的建議,從今天起會逐步的總結一些java、php相關的面試題,由簡單到複雜歸納一個系列:【金三銀四】,中間部分題目的答案來源於網絡,如若不嚴謹還望諒解。java基礎面試題 1、簡述Java程序編譯和運行的過程:答:①  Java編譯程序將Java源程序翻譯為JVM可執行代碼--字節碼,創建完源文件之後,程序會先被編譯成 「.class」 文件。
  • 金三銀四背後,一個JAVA程式設計師的面試心得
    說一說排序算法,穩定性,複雜度。說一說GC。JVM如何加載一個類的過程,雙親委派模型中有哪些方法?TCP如何保證可靠傳輸?三次握手過程?京東面試題java常用的數據結構有哪些?哪些是線程安全的?是怎麼保證線程安全的?Redis中的Lua有沒有使用過? 可以用來做什麼? 為什麼可以這麼用?線程池內部工作原理可以說一下麼?死鎖是什麼意思,形成條件是什麼?
  • Java集合List和Map面試題以及答案
    Map集合它提供了一個鍵映射到值的一個數據結構,記住map的值是個重複,但鍵是唯一的,Map的子類有很多比如創建的是HashMap和LinkedHashMap。面試官常問的面試題1、Vector和Arraylist區別?區別就是synchronization的使用,ArrayList的方法沒有一個是同步的,而vector大多數方法都是同步的。
  • 這是我見過最有用的java面試題,面試了無數公司總結的
    Java 集合框架的面試題這部分也包含數據結構、算法及數組的面試問題38.List、Set、Map 和 Queue 之間的區別(答案)List 是一個有序集合,允許元素重複。它的某些實現可以提供基於下標值的常量訪問時間,但是這不是 List 接口保證的。Set 是一個無序集合。