排序嵌套映射Clojure
我正在尝试按键值对地图进行排序。根据这张地图:排序嵌套映射Clojure,clojure,Clojure,我正在尝试按键值对地图进行排序。根据这张地图: {:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}} 我喜欢按rankvalue对其进行排序: {:2 {:bar "other" :rank 20} :1 {:bar "something" :rank 10} } 是否可以使用排序方式 提前感谢使用排序方式非常简单,但由于它是按升序排序的,因此您必须使用反向才能使其正确运行 (reverse (sort-by (com
{:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}}
我喜欢按rank
value对其进行排序:
{:2 {:bar "other" :rank 20} :1 {:bar "something" :rank 10} }
是否可以使用排序方式
提前感谢使用
排序方式
非常简单,但由于它是按升序排序的,因此您必须使用反向
才能使其正确运行
(reverse
(sort-by (comp :rank second)
{:1 {:bar "something" :rank 10} :2 {:bar "other" :rank 20}}))
排序方式采用键函数和可选的自定义比较器
; 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}])
另见
升序:
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}])
这两种方法都返回map元素的序列,要再次转换回map,将其包装在
(到{}…
中,其他答案也可以,但是如果您要经常执行此命令,那么最好将数据存储在。它是为这种情况设计的
优先级映射非常类似于排序映射,但排序映射生成按键排序的条目序列,而优先级映射生成按值排序的条目
;您需要首先将[org.clojure/data.priority-map“0.0.7”]添加到:依赖项
user=>(需要“[clojure.data.priority-map:as-pm]”)
; 无
用户=>(pm/优先级映射键fn by:rank>
:1{:栏“某物”:排名10}
:2{:栏“其他”:排名20})
; {:2{:排名20,:bar“other”},:1{:排名10,:bar“something”}
这不起作用。添加另一个排名为15的元素作为元素3,你会发现它没有排序,你只得到了10和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}])