Clojure 如何按键对嵌套映射进行排序?

Clojure 如何按键对嵌套映射进行排序?,clojure,Clojure,这个 {0{:数据{7 2,0 1,3 4},1{:数据{2 3,1,0 0}} 应该这样分类 {0{:数据{0 1,3 4,7 2}},1{:数据{0 0,1,2 3}} 您可以使用已排序的地图,例如 (defn-排序映射[m] (放入(已排序的地图)m) (defn排序数据[m] (->m (映射(fn[[k v]][k(更新v:数据排序映射)]) (变成{}) 然后 您可以使用已排序的地图,例如 (defn-排序映射[m] (放入(已排序的地图)m) (defn排序数据[m] (->m

这个

{0{:数据{7 2,0 1,3 4},1{:数据{2 3,1,0 0}}
应该这样分类

{0{:数据{0 1,3 4,7 2}},1{:数据{0 0,1,2 3}}

您可以使用已排序的地图,例如

(defn-排序映射[m]
(放入(已排序的地图)m)
(defn排序数据[m]
(->m
(映射(fn[[k v]][k(更新v:数据排序映射)])
(变成{})
然后


您可以使用已排序的地图,例如

(defn-排序映射[m]
(放入(已排序的地图)m)
(defn排序数据[m]
(->m
(映射(fn[[k v]][k(更新v:数据排序映射)])
(变成{})
然后


我有一个函数
unlazy
,用于将数据转换为规范形式。它递归地遍历任何数据结构,将所有顺序类型转换为向量,并将所有映射/集转换为排序版本。它还将本机Java类型转换为Clojure等效类型:

(defn unlazy
  "Converts a lazy collection to a concrete (eager) collection of the same type."
  [coll]
  (let [unlazy-item (fn [item]
                      (cond
                        (sequential? item) (vec item)

            #?@(:clj  [ (map? item) (into (sorted-map-generic) item)
                        (set? item) (into (sorted-set-generic) item) ]
                :cljs [ (map? item) (into (sorted-map) item) ; #todo => (sorted-map-generic)
                        (set? item) (into (sorted-set) item) ; #todo => (sorted-map-generic)
                      ] )

            #?@(:clj [
                        (instance? java.io.InputStream item) (slurp item)  ; #todo need test
                        (instance? java.util.List item) (vec item)  ; #todo need test
                        (instance? java.util.Map item) (into {} item)  ; #todo need test
                        (instance? java.lang.Iterable item) (into [] item)  ; #todo need test
                     ])
                        :else item))
        result    (walk/prewalk unlazy-item coll) ]
    result))
对于一个简单的情况,可以这样减少:

(ns demo.core
  (:require [clojure.walk :as walk]))

(defn walk-sorted
  [coll]
  (let [sort-item   (fn [item]
                      (cond    
                        (map? item) (into (sorted-map) item)
                        (set? item) (into (sorted-set) item) ]
                        :else item)) ]
      (walk/prewalk sort-item coll)))  ; or postwalk
请注意,已排序的地图/集合仅适用于以良好格式打印(以便于阅读)。否则,它不会影响程序的运行方式


出于高级目的,您可能希望探索并使用。

我有一个函数
unlazy
,用于将数据转换为规范形式。它递归地遍历任何数据结构,将所有顺序类型转换为向量,并将所有映射/集转换为排序版本。它还将本机Java类型转换为Clojure等效类型:

(defn unlazy
  "Converts a lazy collection to a concrete (eager) collection of the same type."
  [coll]
  (let [unlazy-item (fn [item]
                      (cond
                        (sequential? item) (vec item)

            #?@(:clj  [ (map? item) (into (sorted-map-generic) item)
                        (set? item) (into (sorted-set-generic) item) ]
                :cljs [ (map? item) (into (sorted-map) item) ; #todo => (sorted-map-generic)
                        (set? item) (into (sorted-set) item) ; #todo => (sorted-map-generic)
                      ] )

            #?@(:clj [
                        (instance? java.io.InputStream item) (slurp item)  ; #todo need test
                        (instance? java.util.List item) (vec item)  ; #todo need test
                        (instance? java.util.Map item) (into {} item)  ; #todo need test
                        (instance? java.lang.Iterable item) (into [] item)  ; #todo need test
                     ])
                        :else item))
        result    (walk/prewalk unlazy-item coll) ]
    result))
对于一个简单的情况,可以这样减少:

(ns demo.core
  (:require [clojure.walk :as walk]))

(defn walk-sorted
  [coll]
  (let [sort-item   (fn [item]
                      (cond    
                        (map? item) (into (sorted-map) item)
                        (set? item) (into (sorted-set) item) ]
                        :else item)) ]
      (walk/prewalk sort-item coll)))  ; or postwalk
请注意,已排序的地图/集合仅适用于以良好格式打印(以便于阅读)。否则,它不会影响程序的运行方式

出于高级目的,您可能希望探索和了解。

我来了,再次推广!(好像它需要任何提升):

我来了,又升职了!(好像它需要任何提升):


好的图书馆乍一看,我需要看得更详细。好的图书馆乍一看,我需要看得更详细