亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 使用 Steams VS TreeMap 對地圖進行排序

Java 使用 Steams VS TreeMap 對地圖進行排序

慕絲7291255 2022-05-12 17:31:23
考慮以下 Java HashMap。Map<String, String> unsortMap = new HashMap<String, String>();unsortMap.put("Z", "z");unsortMap.put("B", "b");unsortMap.put("A", "a");unsortMap.put("C", "c");現在我想按鍵排序這個地圖。一種選擇是我為此目的使用 TreeMap。Map<String, String> treeMap = new TreeMap<String, String>(unsortMap);我的另一個選擇是使用帶有 Sorted() 的 Java Streams,如下所示。Map<String, Integer> sortedMap = new HashMap<>();unsortMap.entrySet()    .stream()    .sorted(Map.Entry.comparingByKey())    .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));在這兩個中,哪個選項是首選的,為什么(可能是在性能方面)?
查看完整描述

3 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

正如其他人所指出的那樣,將排序的條目流轉儲到常規HashMap中不會做任何事情......LinkedHashMap是合乎邏輯的選擇。


但是,上述方法的替代方法是充分利用 Stream CollectorsAPI。


Collectors有一個toMap方法允許您為Map. HashMap因此,您可以要求這樣,而不是 a LinkedHashMap:


unsortedMap.entrySet()

    .stream()

    .sorted(Map.Entry.comparingByKey())

    .collect(Collectors.toMap(

       Map.Entry::getKey,

       Map.Entry::getValue,

       (v1, v2) -> v1, // you will never merge though ask keys are unique.

       LinkedHashMap::new

    ));

在使用 TreeMap 與 LinkedHashMap 之間......構造的復雜性可能與 O(n log n) 相同......顯然,TreeMap如果您打算繼續向其中添加更多元素,則該解決方案是一種更好的方法......我想TreeMap在這種情況下你應該從 a 開始。該LinkedHashMap選項的優點是,在 Linked 或原始未排序的地圖上查找將是 O(1),而 TreeMap 就像O(log n)這樣,如果您需要保留未排序的地圖以進行高效查找,而在您構建 LinkedHashMap您可以扔掉原始未排序的地圖(從而節省一些內存)。


為了使事情變得更有效率,LinkedHashMap您應該在構造時提供所需大小的良好估計器,這樣就不需要動態調整大小,所以不要LinkedHashMap::new說() -> new LinkedHashMap<>(unsortedMap.size()).


我認為 a 的使用TreeMap更簡潔......因為可以使代碼更小,所以除非存在可以使用未排序和排序的鏈接地圖方法解決的實際性能問題,否則我將使用Tree.


查看完整回答
反對 回復 2022-05-12
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您的流代碼甚至不會對地圖進行排序,因為它正在對 a 執行操作HashMap,而 a 本質上是未排序的。為了使您的第二個流示例正常工作,您可以使用LinkedHashMap,它維護插入順序:


Map<String, Integer> sortedMap = new LinkedHashMap<>();

unsortMap.entrySet()

    .stream()

    .sorted(Map.Entry.comparingByKey())

    .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));

但是現在您的兩個示例甚至都不是相同的底層數據結構。ATreeMap背靠一棵樹(如果我沒記錯的話是紅黑色)。TreeMap如果您希望能夠以排序方式進行迭代,或者快速搜索鍵,您將使用 a 。ALinkedHashMap是帶有一個鏈表的哈希圖。如果您需要維護插入順序,例如在實現隊列時,您將使用它。


查看完整回答
反對 回復 2022-05-12
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

第二種方式不起作用,當您調用時HashMap#put,它不持有看跌訂單。你可能需要LinkedHashMap.

TreeMap vs Stream(LinkedHashMap):

  1. 代碼風格。使用 TreeMap 更簡潔,因為您可以在一行中實現它。

  2. 空間復雜度。如果原圖是HashMap,兩種方法都需要新建一個Map。如果如果原始地圖是LinkedHashMap,那么您只需要Map使用第一種方法創建一個新地圖。您可以重新使用LinkedHashMap第二種方法。

  3. 時間復雜度。它們都應該有 O(nln(n))。


查看完整回答
反對 回復 2022-05-12
  • 3 回答
  • 0 關注
  • 337 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號