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
请注意,已排序的地图/集合仅适用于以良好格式打印(以便于阅读)。否则,它不会影响程序的运行方式
出于高级目的,您可能希望探索和了解。我来了,再次推广!(好像它需要任何提升):
我来了,又升职了!(好像它需要任何提升):
好的图书馆乍一看,我需要看得更详细。好的图书馆乍一看,我需要看得更详细