在seq中的每个项目之间打印逗号

时间:2013-03-13 20:39:44

标签: clojure

我正在寻找一种惯用的方法来打印用逗号分隔的序列的每个项目,而不打印尾随的逗号。我想避免使用clojure.string/join,因为我不想创建一个中间字符串(这就是我以前做过的事情,代码更难以遵循)。我宁愿只打印元素。

这就是我现在所拥有的:

(doseq [element a-map]
  (printf "%s = %s" (key element) (val element))
  (print ", "))

我可以想到几种方法:

  1. 打印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)))
    
  2. 打印除最后一个除逗号之外的所有项目,然后打印doseq之外的最后一项。代码与第一个选项类似,但对于无法随机访问的seqs效率低。

  3. 使用interpose并检查element是否为字符串。

    (doseq [element (interpose ", " a-map)]
      (if (str? element)
        (print element)
        (printf "%s = %s" (key element) (val element))))
    
  4. 我不喜欢1或2,因为重复。因为if条件,我不喜欢3。

1 个答案:

答案 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。