2

我正在寻找一种惯用的方式来打印以逗号分隔的序列的每个项目,而不打印尾随逗号。我想避免使用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. 该代码将类似于第一个选项,但对于不可随机访问的 seq 效率低下。

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

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

由于重复,我不喜欢 1 或 2。由于 if 条件,我不喜欢 3。

4

1 回答 1

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 "")因为我们知道最后一个元素将缺少分隔符,因此它将为空。

于 2013-03-13T21:40:04.173 回答