我正在寻找一种惯用的方法来打印用逗号分隔的序列的每个项目,而不打印尾随的逗号。我想避免使用clojure.string/join
,因为我不想创建一个中间字符串(这就是我以前做过的事情,代码更难以遵循)。我宁愿只打印元素。
这就是我现在所拥有的:
(doseq [element a-map]
(printf "%s = %s" (key element) (val element))
(print ", "))
我可以想到几种方法:
打印doseq
外的第一个项目,然后使用前面的逗号打印每个项目。
(printf "%s = %s" (key (first a-map)) (val (first a-map)))
(doseq [element (rest a-map)]
(print ", ")
(printf "%s = %s" (key element) (val element)))
打印除最后一个除逗号之外的所有项目,然后打印doseq
之外的最后一项。代码与第一个选项类似,但对于无法随机访问的seqs效率低。
使用interpose
并检查element
是否为字符串。
(doseq [element (interpose ", " a-map)]
(if (str? element)
(print element)
(printf "%s = %s" (key element) (val element))))
我不喜欢1或2,因为重复。因为if条件,我不喜欢3。
答案 0 :(得分:3)
好的,这是一个新尝试:
(defn str-commas [a-map]
(doseq [[[k v] sep] (partition-all 2 (interpose ", " a-map))]
(printf "%s = %s%s" k v (or sep ""))))
partition
返回大小为N的列表,但由于插入逗号不会创建偶数个元素,因此删除了最后一个键值对。 partition-all
可能包含元素较少的分区(最后一个元素只包含键值对)。
诀窍是使用(or sep "")
,因为我们知道最后一个元素缺少一个分隔符,因此它将为null。