根据自定义比较器排序

Ced*_*tin 3 sorting vector clojure map

我有一张看起来像这样的地图:

user> (frequencies "aaabccddddee")
{\a 3, \b 1, \c 2, \d 4, \e 2}
Run Code Online (Sandbox Code Playgroud)

而且我希望有一个函数可以根据每个字符出现在我作为参数传递的字符串中的顺序对键/值对进行排序.

像这样的东西:

user> (somesort "defgcab" (frequencies "aaabccddddee"))
[[\d 4] [\e 2] [\c 2] [\a 3] [\b 1]]
Run Code Online (Sandbox Code Playgroud)

(在上面的示例中,'f'和'g'没有出现在地图中,因此它们被忽略.保证字符串 - 本例中的"defgcab" - 应该包含地图中的每个字符/键)

只要对它进行排序,结果集合就没那么重要了.

我尝试了几件事,但找不到办法使这项工作.

ama*_*loy 6

我更喜欢使用sort-by排序逻辑,只需为您的集合创建自定义比较器:

(defn sorter [coll] (zipmap coll (range)))

(sort-by (comp (sorter "defgcab") key) 
         (frequencies "aaabccddddee"))

;=> ([\d 4] [\e 2] [\c 2] [\a 3] [\b 1])
Run Code Online (Sandbox Code Playgroud)

编辑:这有一个进一步的优势,你可以保留你的收藏集,如果你想,虽然你还需要做一些工作:

(defn map-sorter [coll]
  (let [order (zipmap coll (range))]
    (fn [a b]
      (compare (order a) (order b)))))

(into (sorted-map-by (map-sorter "defgcab"))
      (frequencies "aaabccddddee"))

;=> {\d 4, \e 2, \c 2, \a 3, \b 1}
Run Code Online (Sandbox Code Playgroud)