Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中创建字符串索引的映射?_Clojure - Fatal编程技术网

如何在Clojure中创建字符串索引的映射?

如何在Clojure中创建字符串索引的映射?,clojure,Clojure,我想创建一个映射,其中键是字符串中的字符,每个键的值是字符串中给定字符的位置列表。我确信有几种解决方案。我的第一个想法是获得一个[索引字符]列表,然后将集合放入一个映射中 (defn char-index-map [sz] (reduce (fn [accum [i ch]] (update accum ch conj i)) {} (map-indexed vector sz))) (char-index-map "aabcab") ;;=> {\a

我想创建一个映射,其中键是字符串中的字符,每个键的值是字符串中给定字符的位置列表。

我确信有几种解决方案。我的第一个想法是获得一个[索引字符]列表,然后将集合放入一个映射中

(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)}
略短一点的变体:

(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]}

请注意,这里的索引已排序

到目前为止您尝试了什么?分享你所拥有的,以便清楚问题的哪一部分让你陷入困境。@Piotrek Bzdyl-我被Clojure的不变性所困扰。通常当你想从现有结构创建新结构时,reduce或loop/recur是一个很好的起点。棘手的部分是找出是否已经有一个更高阶的函数或它们的组合完成了你想要做的事情。我忘了我要指出的是,`[I ch]`正在将元组分解为符号I,ch,我的模式通常是使用fnil conj[]来完成这类事情,所以我不必在以后反转索引,我同意。我通常也使用fnil,但在这种情况下,并不明显需要它,conj可以处理nil。应用合并到映射索引fn[ix]{x[I]}xs另一种解决方案具有反向排序索引,这可能更适合我要解决的问题。