[英]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]]
這不是一個可靠的功能來保存訂單,以及keys
和vals
不保留你如何定義地圖的順序。 最可靠的方法是使用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.