2013-03-13 43 views
2

我正在尋找一種慣用的方法來打印以逗號分隔的序列中的每個項目,而不打印結尾的逗號。我想避免使用clojure.string/join,因爲我不想創建一箇中間字符串(這就是我之前做的事情,代碼更難以遵循)。我寧願只打印元素。在seq中的每個項目之間打印逗號

這就是我現在所擁有的:

(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。

+0

爲什麼你需要檢查元素是#3中的一個字符串 - 你還期望它是什麼?順便說一句,爲什麼你需要在#3中打印(打印元素)? – 9000 2013-03-13 20:51:13

+0

哦,看起來我有一些拼寫錯誤,我使用'a-map'而不是'element'。但爲了回答你的問題,我期望'element'可以是來自'a-map'的字符串或地圖元素。 – Brigham 2013-03-13 20:53:44

回答

3

OK,這裏是一個新的嘗試:

(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 ""),因爲我們知道最後一個元素將缺少分隔符,因此它將爲空。

+0

不幸的是,這只是等同於'(clojure.string/join ...)',我試圖避免爲此代碼創建一箇中間字符串。 – Brigham 2013-03-13 22:35:18

+0

@布里漢姆 - 這個版本應該沒有中間字符串 – 2013-03-13 23:47:37

+0

很酷,這是一個很好的方式來做到這一點。 – Brigham 2013-03-14 00:18:52

相關問題