我有一个如下所示的向量:
[ "1" "2" "3" "4" ]
我希望编写一个函数,将向量返回到:
[ 1 "2" 3 4 ]
; Note that the second element is still a string
请注意,没有任何更改,而是返回一个全新的向量。在 Clojure 中执行此操作的最简单方法是什么?
最佳答案
map 索引是一个不错的选择。调用您传递的函数,其中包含输入中的一项的值以及找到它的索引(索引优先)。该函数可以选择生成一个新值或返回现有值。
user> (map-indexed (fn [i v]
(if-not (= 1 i)
(Integer/parseInt v)
v))
[ "1" "2" "3" "4"])
(1 "2" 3 4)
当 if
返回 v 时,它与结果映射中的值完全相同,因此您可以在选择保留的部分中保留结构共享的优势。如果您希望输出保留为向量,那么您可以使用 mapv 并自行传递索引序列。
user> (mapv (fn [i v]
(if-not (= 1 i)
(Integer/parseInt v)
v))
(range)
[ "1" "2" "3" "4"])
[1 "2" 3 4]
有很多种写法
关于Clojure - 适用于除第 n 个元素之外的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873002/