簡體   English   中英

select-keys是否保留了keyseq的順序?

[英]Does select-keys preserve order from its keyseq?

看一下這個例子:
(into [] (select-keys {:a 1 :b 2 :c 3} [:c :b])) => [[:c 3] [:b 2]]
是否保證返回的結果將保留在select-key第二個參數中聲明的順序?

select-keys返回一個無序的地圖,因此你不能依賴它。 小地圖表示為維護順序的數組,但隨着大小的增加,這會被打破

(def m {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9 :j 10 :k 11 :l 12 :m 13})
(into [] (select-keys m [:a :b :c :d :e :f :g :h :i :j :k]))
=> [[:e 5] [:k 11] [:g 7] [:c 3] [:j 10] [:h 8] [:b 2] [:d 4] [:f 6] [:i 9] [:a 1]]

這不是一個可靠的功能來保存訂單,以及keysvals不保留你如何定義地圖的順序。 最可靠的方法是使用loop / recur如果你想輸出一個有序的kv向量(或者還有一個reduce )。 如果只需要有序值,可以使用juxt

我想補充一點,實用的hashmaps並不代表有序數據。

如果排序相當簡單,您可以使用sorted-map-by輕松地對地圖進行sorted-map-by

(def m (select-keys {:a 1 :b 2 :c 3 :d 4} [:d :b]))
=> {:d 4, :b 2}

(def sm (sorted-map-by compare)) 
(into sm m)
=> {:b 2, :d 4}

(assoc *1 :c 1234)
=> {:b 2, :c 1234, :d 4}  ; maintains sort when additional kvs are assoc'd

(into [] *1)
=> [[:b 2] [:c 1234] [:d 4]]

即使排序不簡單,您也可以編寫自定義比較器。 這充滿了陷阱,但有一個非常好的指南 這不是你原來追求的,但它是相關的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM