企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 集合 Sets 是一个包含不重复元素的集合。当我们要求集合里面的元素不可以重复,并且我们不要求集合里面的元素保持它们添加时候的顺序,那么sets是比较适合的。 Clojure 支持两种不同的set: 排序的和不排序的。如果添加到set里面的元素相互之间不能比较大小,那么一个 `ClassCastException` 异常会被抛出来。下面是一些创建set的方法: ``` (def stooges (hash-set "Moe" "Larry" "Curly")) ; not sorted (def stooges #{"Moe" "Larry" "Curly"}) ; same as previous (def stooges (sorted-set "Moe" "Larry" "Curly")) ``` `contains?` 函数可以操作sets和maps. 当操作set的时候, 它返回给定的set是否包含某个元素。这比在list和vector上面使用的 `some函数就简单多了` . 看例子: ``` (contains? stooges "Moe") ; -> true (contains? stooges "Mark") ; -> false ``` Sets 可以被当作它里面的元素的函数来使用. 当以这种方式来用的时候,返回值要么是这个元素,要么是nil. 这个比起contains?函数来说更简洁. 比如: ``` (stooges "Moe") ; -> "Moe" (stooges "Mark") ; -> nil (println (if (stooges person) "stooge" "regular person")) ``` 在介绍list的时候提到的函数 `conj` 和 `into` 对于set也同样适用. 只是元素的顺序只有对sorted-set才有定义. `disj` 函数通过去掉给定的set里面的一些元素来创建一个新的set. 看例子: ``` (def more-stooges (conj stooges "Shemp")) ; -> #{"Moe" "Larry" "Curly" "Shemp"} (def less-stooges (disj more-stooges "Curly")) ; -> #{"Moe" "Larry" "Shemp"} ``` 你也可以看看 `clojure.set` 名字空间里面的一些函数: `difference` , `index` , `intersection` , `join` , `map-invert` , `project` , `rename` , `rename-keys` , `select` 和 `union` . 其中有些函数的操作的对象是map而不是set。