clojure - 有没有办法在 Clojure 中返回集合的最后一个元素?
问题描述
user-> (last '(First (Second (Last))))
-> (Second (Last))
我通常会假设这个 ^ 只会返回(最后一个)。为什么是这样?有没有办法只返回(最后一个)或最后一个。
还有什么:
(defn function
[input] ;assume input = '(First (Second (Last)))
(last input)
)
解决方案
严格来说,(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
推荐阅读
- c# - 为什么 Auth0 登录屏幕不返回 UWP 应用
- sql - 如何减小 SQL 日志文件大小
- amazon-web-services - 无法使用 PuTTY 连接到 Amazon EC2 实例
- hbase - 为什么 HBase 删除恢复到以前的值而不是完全删除它
- forms - 尝试创建颜色以更改 Windows::Form 的背景时出现 C2228 错误
- angular - 绑定表达式不能包含链式表达式(Angular 8)
- relayjs - 在进行节点查询时,react-relay 会在发出网络请求之前检查该节点是否在存储中吗?
- android - ScrollView 根本无法滚动
- json - 使用 JQ 将 JSON 嵌套到 CSV
- c# - DataTable.Load() 将枚举转换为整数