返回文章列表

文章

Clojure中的Vector、List、Set以及Map的表示方法,以及Vector和List,Seq的区别

目录
  1. 好的,以下是 Clojure 中 Vector、List、Set、Map 和 Seq 的表示方法、区别与使用场景的完整整合总结,适合做笔记或复习使用:
  2. ✅ Clojure 核心集合类型详解
  3. 一、集合类型与字面量表示
  4. 二、Vector vs List vs Seq 的区别
  5. 三、使用场景对比
  6. ✅ Vector
  7. (def v [10 20 30]) (nth v 1) ;; => 20 (conj v 40) ;; => [10 20 30 40] ```
  8. ✅ List
  9. (defn sum [lst] (if (seq lst) (+ (first lst) (sum (rest lst))) 0)) (sum '(1 2 3)) ;; => 6 ```
  10. ✅ Set
  11. (def s #{1 2 3}) (contains? s 2) ;; => true (clojure.set/difference #{1 2 3} #{2}) ;; => #{1 3} ```
  12. ✅ Map
  13. (def user {:id 1 :name "Alice"}) (:name user) ;; => "Alice" (assoc user :email "a@example.com") ```
  14. ✅ Seq(序列抽象)
  15. (->> (range) (filter even?) (take 5)) ;; => (0 2 4 6 8) ```
  16. 四、推荐选择指南

好的,以下是 Clojure 中 Vector、List、Set、Map 和 Seq 的表示方法、区别与使用场景的完整整合总结,适合做笔记或复习使用:#

✅ Clojure 核心集合类型详解#

一、集合类型与字面量表示#

类型字面量表示说明
Vector[1 2 3]有序、可随机访问、尾部插入快
List'(1 2 3)有序、链表结构、适合递归和头插
Set#{1 2 3}无序、去重、查找快(哈希实现)
Map{:a 1 :b 2}键值对、快速查找、结构化数据
Seq(seq coll)遍历接口的抽象,不是具体结构

二、Vector vs List vs Seq 的区别#

特性VectorListSeq
底层结构位分割持久化数组树(RRBT)单链表抽象接口,统一遍历
随机访问(nth)✅ O(log₃₂ n) ≈ O(1)❌ O(n)❌ 取决于来源集合
头部插入(cons)⚠️ 较慢✅ 快(O(1))✅ 一般支持
尾部插入(conj)✅ 快❌ 慢(重建)⚠️ 非结构性操作
遍历方式快速通过索引或 seq 遍历快速 first/rest惰性、一致的 first/rest/next 接口
是否可变模拟(transient)✅ 支持❌ 不支持❌ 不适用

三、使用场景对比#

Vector#

  • 快速索引、修改或尾部插入
  • 构建固定结构数组、表格数据、序号有意义的数据
  • 示例:

(def v [10 20 30]) (nth v 1) ;; => 20 (conj v 40) ;; => [10 20 30 40] ```#

List#

  • 适合递归、头插构造(如 cons
  • 用作代码结构本身(S 表达式)
  • 示例:

(defn sum [lst] (if (seq lst) (+ (first lst) (sum (rest lst))) 0)) (sum '(1 2 3)) ;; => 6 ```#

Set#

  • 快速查重与去重
  • 判断元素是否存在(contains?
  • 执行集合运算(交集、并集、差集)
  • 示例:

(def s #{1 2 3}) (contains? s 2) ;; => true (clojure.set/difference #{1 2 3} #{2}) ;; => #{1 3} ```#

Map#

  • 存储结构化数据(如 JSON)
  • 键值查询、配置映射、属性组合等
  • 示例:

(def user {:id 1 :name "Alice"}) (:name user) ;; => "Alice" (assoc user :email "a@example.com") ```#

Seq(序列抽象)#

  • 惰性操作、流式处理(map/filter/reduce)
  • 所有集合都可视为 seq 处理:统一接口
  • 用于惰性链式处理大量数据或无限数据流
  • 示例:

(->> (range) (filter even?) (take 5)) ;; => (0 2 4 6 8) ```#

四、推荐选择指南#

需求场景推荐使用
按下标快速读取/更新✅ Vector
构造嵌套表达式/递归遍历✅ List
去重或集合逻辑操作✅ Set
键值对结构/快速查找✅ Map
流式操作/统一遍历✅ Seq