2017-02-13 44 views
0

我想創建一個映射,其中鍵是字符串中的字符,每個鍵的值都是字符串中給定字符位置的列表。如何在Clojure中創建字符串索引的映射?

+4

你嘗試過這麼遠嗎?分享你所擁有的東西,很清楚你遇到了什麼問題。 –

+0

@Piotrek Bzdyl - 我被困在Clojure的不變性中。 –

+0

通常,當您想從現有結構創建新結構'reduce'或'loop/recur'時,這是一個很好的起點。棘手的部分是弄清楚,如果已經有一個更高階的函數或組合已經做了你想要做的。 – Scott

回答

4

我確信有幾種解決方案。我的第一個想法是使用map-indexed獲取[index character]的列表,然後reduce集合到地圖中。

(defn char-index-map [sz] 
    (reduce 
    (fn [accum [i ch]] 
    (update accum ch conj i)) 
    {} 
    (map-indexed vector sz))) 


(char-index-map "aabcab") 

;;=> {\a (4 1 0), \b (5 2), \c (3)} 
+0

我忘了我要指出的是,[i ch]'正在將* tuple *解構成符號i,ch https://clojure.org/guides/destructuring – Scott

+0

我的模式通常是使用'( fnil conj [])'這樣的東西,所以我不必在後面反轉索引, – galdre

+0

我同意。我通常也使用'fnil',但在這種情況下,它並不明顯,它是必需的,'conj'可以處理'nil'。 – Scott

6

短一點的變體:該指數在這裏

(defn process [^String s] 
    (group-by #(.charAt s %) (range (count s)))) 


user> (process "asdasdasd") 
;;=> {\a [0 3 6], \s [1 4 7], \d [2 5 8]} 

通知進行排序

+0

另一種解決方案具有反向排序索引,這對我想解決的問題可能更好。 –

相關問題