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

时间:2016-06-29 22:37:25

标签: collections clojure

看一下这个例子:
(into [] (select-keys {:a 1 :b 2 :c 3} [:c :b])) => [[:c 3] [:b 2]]
是否保证返回的结果将保留在select-key的第二个参数中声明的顺序?

3 个答案:

答案 0 :(得分:7)

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]]

答案 1 :(得分:1)

如果订购相当简单,您可以使用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]]

即使排序不简单,您也可以编写自定义比较器。这充满了陷阱,但a guide非常好。这不是你原来所追求的,但它是相关的。

答案 2 :(得分:0)

保留订单不是一个可靠的功能,以及module _ wherekeys不保留您定义地图的顺序。 如果您想输出kv(或vals的有序向量),最可靠的方法是使用loop / recur。 如果您只想要订购值,可以使用reduce

我想补充一点,实用的哈希图并不代表有序数据。