如何在Clojure中将列表或向量转换为有序集?

new*_*ple 11 clojure sortedset

在Clojure中,该set函数自动将a vectorlista 转换为a set.但事实并非如此sorted-set:

(set [3 2 1])  ; #{1 2 3}
(set '(3 2 1)) ; #{1 2 3}
(sorted-set [3 2 1])  ; #{[3 2 1]}
(sorted-set '(3 2 1)) ; #{(3 2 1)}
Run Code Online (Sandbox Code Playgroud)

这是我提出的解决方案:

(defn sorted-set-from-coll [coll]
    (eval (cons sorted-set (seq coll))))

(def v [3 2 1])
(sorted-set-from-coll v)        ; #{1 2 3}
(sorted-set-from-coll '(3 2 1)) ; #{1 2 3}
(sorted-set-from-coll [3 1 2])  ; #{1 2 3}
Run Code Online (Sandbox Code Playgroud)

没有eval,有更好/更惯用的方法吗?

kot*_*rak 18

into 在这种情况下也非常有用.

user=> (into (sorted-set) [3 1 2])
#{1 2 3}
Run Code Online (Sandbox Code Playgroud)


Jon*_*nas 9

你可以使用apply这个:

user=> (apply sorted-set [3 1 2])
#{1 2 3}
Run Code Online (Sandbox Code Playgroud)

  • `into`更加惯用,因为它既传达了正在发生的事情(一个数据结构又传递到另一个数据结构),并且可以与现有的目标数据结构一起使用. (3认同)