跳转到内容

学习 Clojure/数据结构

来自 Wikibooks,开放世界中的开放书籍

集合是一个不包含重复项的集合。 Clojure 有两种集合类型

  • 哈希集被实现为哈希映射,因此具有(近乎)恒定的查找、插入和删除时间。
  • 排序集被实现为有序二叉树,因此具有对数查找、插入和删除时间。

读取器识别哈希集的文字语法

#{67 2 8.8 -78}     ; a hash set of four numbers

惰性序列

[编辑 | 编辑源代码]

许多序列函数生成惰性序列,它们不是由自身数据支持的序列:惰性序列的项是按需从函数生成或从其他来源(例如另一个集合)检索的。例如,代表预先存在的向量的前 8 项的序列可以是惰性的,因为不需要复制项:如果我们说请求惰性序列的第 3 项,我们将得到向量的第 3 项。

基于函数的惰性序列根据传递给函数的索引生成项。由于此类序列根本没有实际数据支持,因此它们可以是无限的。例如,函数cycle返回一个惰性序列,代表另一个序列的无休止重复

(cycle [1 2 3])   ; returns a lazy sequence of 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3... etc.

[嗯,在什么情况下惰性序列会保留生成的项?我假设循环不会最终由一个巨大的实际列表或向量支持,但doseq似乎保留了生成的的值。哪些其他情况与doseq类似?]

StructMaps

[编辑 | 编辑源代码]

Clojure 所谓的structmap(如“结构映射”)仅仅是持久哈希映射的变体,但其中预定义的键集具有优化的存储和查找。

Structmap 是通过首先调用clojure/create-struct 来定义称为基础的蓝图而创建的。然后使用函数clojure/struct-map 使用基础创建实际的 structmap

(def george (create-struct :apple :banana :orange))
(struct-map george :apple 3 :banana 9 :orange 12)     ; create a structmap with the key-val pairs :apple => 3, :banana => 9, and :orange => 12
(struct-map george :banana 9 :apple 3 :orange 12)     ; notice the key order need not be that used in create-struct
(struct-map george :apple 3 :orange 12)               ; the key :banana is not specified, so its value defaults to nil

您可以通过仅使用clojure/struct 指定键的值来创建 structmap

(struct george -87 0 9)      ; keys implied by their order in create-struct, so this is :apple => -87, :banana => 0, :orange => 12
Previous page
数据类型
学习 Clojure Next page
元数据
数据结构
华夏公益教科书