【问题标题】:How can I sort a clojure set of maps?如何对一组 clojure 地图进行排序?
【发布时间】:2023-04-04 01:42:01
【问题描述】:

我有一组类似这样的地图:

#{
  {:name "a" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "c" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
}

:我想得到一个有序列表,很像 sql order-by name:

[
  {:name "a" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "c" :value "b" ... more stuff here}
]

:我该怎么做?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    函数sort-by 是您正在寻找的:

    (def s
      #{
        {:name "d" :value "b" }
        {:name "b" :value "b" }
        {:name "c" :value "b" }
        })
    (sort-by :name s)
    

    【讨论】:

    • 简单、精确、简洁。像魅力一样工作@Leonel
    【解决方案2】:

    sort-by 是一个很好的答案,它可以使代码在其工作的简单情况下变得更好。此外,排序函数可以采用一个函数从每个映射中提取比较键,以防您需要对每个项目进行一些处理。在此示例中,我使用了一个排序函数,该函数提取每个名称,然后对它们进行字符串比较。

    (sort #(compare (:name %1) (:name %2)) data)
    =>  ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})
    

    如果您的集合有不同的要比较的名称,这很有用:

    (sort #(compare (:value %1) (:name %2)) data)
    => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "b", :value "b"})
    

    compare 函数是 java 的 .compareto() 的更好版本,因为它可以正确处理 nil 并正确比较 clojure 集合。 is 基本上是使用 .大多数情况下的操作员

    (sort #(. (:name %1) (compareTo (:name %2))) data)
    => ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})
    

    【讨论】:

    • 我不明白,请您再解释一下这是如何工作的?
    【解决方案3】:

    (def set-of-maps #{{:name "d"}, {:name "b"}, {:name "a"}})

    ->clojure.core/sort-by

    (sort-by :name set-of-maps)

    ; => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "d", :value "b"})

    【讨论】:

      【解决方案4】:

      sort-by 是你想要的,但请发布实际上是有效代码的sn-ps;我浪费了相当多的时间试图找出一个问题,因为#{{:name "a" :value "b"} {:name "a" :value "b"}} 让读者感到厌烦。

      【讨论】:

      • “这里有更多东西”可以防止重复键错误。
      【解决方案5】:

      我相信 clojure 中的 sn-p 是最简洁的。

      (def plays [{:band "Burial",     :plays 979,  :loved 9}
                 {:band "Eno",        :plays 2333, :loved 15}
                 {:band "Bill Evans", :plays 979,  :loved 9}
                 {:band "Magma",      :plays 2665, :loved 31}])
      
      (def sort-by-loved-ratio (partial sort-by #(/ (:plays %) (:loved %))))
      

      【讨论】:

        猜你喜欢
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-28
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        相关资源
        最近更新 更多