首页 > 解决方案 > 有没有办法在 Clojure 中返回集合的最后一个元素?

问题描述

user-> (last '(First (Second (Last))))
-> (Second (Last))

我通常会假设这个 ^ 只会返回(最后一个)。为什么是这样?有没有办法只返回(最后一个)或最后一个。

还有什么:

(defn function
 [input]              ;assume input = '(First (Second (Last)))

 (last input)

 )

标签: clojure

解决方案


严格来说,(First (Second (Last)))不是一个Set,而是一个List。Set 是元素的集合,没有重复元素,并且不需要元素的顺序。

如果你仔细观察,它是一个包含 2 个元素的列表。第一个元素是符号First,第二个元素本身就是一个列表:(Second (Last))

Clojure 的基本思想之一是序列抽象:多种集合数据类型允许您一次获取一个元素。您可以在 HashMaps、Sets、Vectors 和 Lists 等集合中调用该函数seq

在您的情况下,您有一个嵌套的数据集合:一个列表,其中一个元素是一个列表,依此类推......

对于嵌套数据结构,您可以使用tree-seq,它将一次遍历嵌套列表一个元素,在需要的地方进入嵌套集合。tree-seq接受 2 或 3 个参数:一个可选函数,用于确定一个元素是否是一个分支(例如,包含其他元素),获取分支子项的函数,以及要遍历的集合。


(tree-seq sequential? identity '(First (Second (Last))))

;; Note: Commas added for clarity
;; => ((First (Second (Last))), First, (Second (Last)), Second, (Last), Last)

由此,您可以清楚地提取最后一个元素last

(last (tree-seq sequential? identity '(First (Second (Last)))))
;; => Last

推荐阅读