Clojure中如何对嵌套的map进行排序

3

我正在尝试按键值对一个映射进行排序。给定这个映射:

{:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}}

我想按照排名的值排序:

{:2 {:bar "other" :rank 20} :1 {:bar "something" :rank 10} }

是否可以使用 sort-by 进行排序?

提前感谢您的帮助。

4个回答

3
其他答案也可以实现相同的效果,但如果您要经常执行此命令,最好将数据存储在data.priority-map中。这是专门为此类情况设计的。

优先级映射与排序映射非常相似,但排序映射会按键产生一个已排序条目序列,而优先级映射则按值产生已排序的条目序列。

; You'll need to add [org.clojure/data.priority-map "0.0.7"] to :dependencies first

user=> (require '[clojure.data.priority-map :as pm])
; nil
user=> (pm/priority-map-keyfn-by :rank > 
         :1 {:bar "something" :rank 10}
         :2 {:bar "other" :rank 20})
; {:2 {:rank 20, :bar "other"}, :1 {:rank 10, :bar "something"}}

3

使用 sort-by 很容易实现,但是由于它按升序排序,因此您需要使用 reverse 来使其以正确的方式进行。

(reverse
    (sort-by (comp :rank second)
        {:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}}))

这个不行。再添加一个排名为15的元素作为第3个元素,你会发现它没有排序,你只有10和20恰好按照你想要的顺序排序。 - Mark Fisher
是的,我只是再玩一下。它似乎是按字典顺序排序,这不是我想要的。 - Makoto
谢谢你的回答。也很高兴知道这个信息。 - Édipo Féderle

3

sort-by除了可选的自定义比较器外,还需要一个键函数

;              keyfn         comparator
(sort-by (comp :rank second) > 
  {:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}})
;=> ([:2 {:bar "other", :rank 20}] [:1 {:bar "something", :rank 10}])

你如何使用(get)而不是:rank来完成这个任务?例如,一个字符串是键名。 - triplej
1
@triplej,由于在可以使用fn的地方使用了:rank,因此可以使用任何fn:例如(comp #(get % "foo") second) - 关键字可以使用与sort-by无关,而与Maps的工作方式有关,即(:foo a-map)可以工作,但("foo" a-map)不能。 -(为了完整起见, Maps是对它们自身的查找,因此(a-map :foo)也可以工作) - birdspider

2

另请参见此答案

升序:

user=> (sort-by (comp :rank second) < {:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20} :3 {:bar "bar" :rank 15}})
([:1 {:bar "something", :rank 10}] [:3 {:bar "bar", :rank 15}] [:2 {:bar "other", :rank 20}])

降序:

user=> (sort-by (comp :rank second) > {:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20} :3 {:bar "bar" :rank 15}})
([:2 {:bar "other", :rank 20}] [:3 {:bar "bar", :rank 15}] [:1 {:bar "something", :rank 10}])

这两个函数返回map元素的序列,如果要将其转换回map,请使用(into {} ...)进行包装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接