2017-02-13 45 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

另一种解决方案具有反向排序索引,这对我想解决的问题可能更好。 –

相关问题