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