3 回答

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.

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是帶有一個鏈表的哈希圖。如果您需要維護插入順序,例如在實現隊列時,您將使用它。

TA貢獻1744條經驗 獲得超4個贊
第二種方式不起作用,當您調用時HashMap#put
,它不持有看跌訂單。你可能需要LinkedHashMap
.
TreeMap vs Stream(LinkedHashMap):
代碼風格。使用 TreeMap 更簡潔,因為您可以在一行中實現它。
空間復雜度。如果原圖是
HashMap
,兩種方法都需要新建一個Map
。如果如果原始地圖是LinkedHashMap
,那么您只需要Map
使用第一種方法創建一個新地圖。您可以重新使用LinkedHashMap
第二種方法。時間復雜度。它們都應該有 O(nln(n))。
添加回答
舉報