目录
当前位置: 首页 > 文档资料 > Clojure 入门教程 >

8.1 列表

优质
小牛编辑
134浏览
2023-12-01

列表

Lists是一个有序的元素的集合 — 相当于java里面的LinkedList。这种集合对于那种一直要往最前面加一个元素,干掉最前面一个元素是非常高效的(O(1)) — 想到于java里面的堆栈, 但是没有高效的方法来获取第N个元素, 也没有高效的办法来修改第N个元素。

下面是创建同样的list的多种不同的方法:

(def stooges (list "Moe" "Larry" "Curly"))
(def stooges (quote ("Moe" "Larry" "Curly")))
(def stooges '("Moe" "Larry" "Curly"))

some 可以用来检测一个集合是否含有某个元素. 它的参数包括一个谓词函数以及一个集合。你可以能会想了,为了要看一个list到底有没有某个元素为什么要指定一个谓词函数呢?其实我们是故意这么做来让你尽量不要这么用的。从一个list里面搜索一个元素是线性的操作(不高效),而要从一个set里面搜索一个元素就容易也高效多了,看下面的例子对比:

(some #(= % "Moe") stooges) ; -> true
(some #(= % "Mark") stooges) ; -> nil
; Another approach is to create a set from the list
; and then use the contains? function on the set as follows.
(contains? (set stooges) "Moe") ; -> true

conjcons 函数的作用都是通过一个已有的集合来创建一个新的包含更多元素的集合 — 新加的元素在最前面。 remove 函数创建一个只包含所指定的谓词函数测试结果为false的元素的集合:

(def more-stooges (conj stooges "Shemp")) -> ("Shemp" "Moe" "Larry" "Curly")
(def less-stooges (remove #(= % "Curly") more-stooges)) ; -> ("Shemp" "Moe" "Larry")

into 函数把两个list里面的元素合并成一个新的大list

(def kids-of-mike '("Greg" "Peter" "Bobby"))
(def kids-of-carol '("Marcia" "Jan" "Cindy"))
(def brady-bunch (into kids-of-mike kids-of-carol))
(println brady-bunch) ; -> (Cindy Jan Marcia Greg Peter Bobby)

peekpop 可以用来把list当作一个堆栈来操作. 她们操作的都是list的第一个元素。