有关选择键功能的问题

时间:2017-08-03 13:19:35

标签: clojure

理想情况下,select-keys按键seq向量的顺序返回带有键的映射。但我发现只有当你的钥匙数量少于10时才会发生。

(def params {:resource-total-calls-abandoned 1, :resource-idle-time 5, :date "2016-12-31", :resource-wrap-up-time 1, :agent-talk-time 1, :resource-work-offers 3, :aux-in-time 1, :user-id 2183, :resource-not-ready-time 3, :split 1, :aux-out-time 1, :resource-logged-in-time 1, :hold-time 115, :acd-calls 1})

(select-keys  params [:user-id
                                            :date
                                            :split
                                            :resource-logged-in-time
                                            :agent-talk-time
                                            :resource-wrap-up-time
                                            :hold-time
                                            :acd-calls
                                            :resource-total-calls-abandoned

                                            ])

这是我的结果:

{:user-id 2183, :date "2016-12-31", :split 1, :resource-logged-in-time 1, :agent-talk-time 1, :resource-wrap-up-time 1, :hold-time 115, :acd-calls 1, :resource-total-calls-abandoned 1}

如果我从一张巨大的地图中选择了10个以上的按键,地图的顺序将与按键的顺序不同

(select-keys  params [:user-id
                                            :date
                                            :split
                                            :resource-logged-in-time
                                            :agent-talk-time
                                            :resource-wrap-up-time
                                            :hold-time
                                            :acd-calls
                                            :resource-total-calls-abandoned
                                            :aux-in-time
                                            ])

结果会有所不同:

{:resource-total-calls-abandoned 1, :date "2016-12-31", :resource-wrap-up-time 1, :agent-talk-time 1, :aux-in-time 1, :user-id 2183, :split 1, :resource-logged-in-time 1, :hold-time 115, :acd-calls 1}

无论您想选择多少个键,还是按照keyseq向量的顺序返回带有键的地图的其他想法?

1 个答案:

答案 0 :(得分:2)

如果你想要一个带有顺序的关联结构,有一个sorted-map可以维持其元素的顺序。一个袖手旁观的解决方案可能是首先选择你想要的键,然后将它们放在一个新的有序地图中。

(def k [:user-id
        :date
        :split
        :resource-logged-in-time
        :agent-talk-time
        :resource-wrap-up-time
        :hold-time
        :acd-calls
        :resource-total-calls-abandoned
        :aux-in-time])

(->> (select-keys params k)
     (into (sorted-map-by #(< (.indexOf k %1) (.indexOf k %2)))))

上面的比较器函数#(< ...只是一个例子;如果你以这种方式创建一个有序的地图,对它的更新(例如,assoc)肯定会做错事。原因是向量k中的索引用于比较元素的顺序,但对于不在向量中的任何元素,它是-1。

更有效的解决方案可能是将地图上的减少转换为已排序的数据结构。

更新:根据@leetwinski的建议,将apply更改为into,这样就无需在select-keys之后展平地图。