Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Clojure对嵌套排序映射重新排序_Clojure - Fatal编程技术网

使用Clojure对嵌套排序映射重新排序

使用Clojure对嵌套排序映射重新排序,clojure,Clojure,我有这张分类地图: (def my-map {1 {:foo "String_1" :ordnen 5 } 2 {:foo "String_2" :ordnen 4} 3 {:foo "String_3" :ordnen 3} 4 {:foo "String_4" :ordnen 1} }) 我需要使用:ordnen关键字中保留的值以上升的方式对其重新排序。因此,最终排序的地图如下所示: {4 {:

我有这张分类地图:

 (def my-map {1 {:foo "String_1" :ordnen 5 } 
              2 {:foo "String_2" :ordnen 4} 
              3 {:foo "String_3" :ordnen 3} 
              4 {:foo "String_4" :ordnen 1} })
我需要使用:ordnen关键字中保留的值以上升的方式对其重新排序。因此,最终排序的地图如下所示:

  {4 {:foo "String_4" :ordnen 1}
   3 {:foo "String_3" :ordnen 3}
   2 {:foo "String_2" :ordnen 4} 
   1 {:foo "String_1" :ordnen 5 }}
我试过:

(into (sorted-map-by (fn [key1 key2] (compare (:ordnen key1) (:ordnen key2)))) my-map)
但是我不知道如何正确地获取和比较:ordnen

的值

(into
 (sorted-map-by
  (fn [key1 key2]
    (compare
     [(get-in my-map [key1 :ordnen]) key1]
     [(get-in my-map [key2 :ordnen]) key2])))
 my-map)
所以你想按值排序。在您的示例中,该值是映射,然后需要根据该映射中:ordnen键的值进行排序。(get in my map[key:ordnen])是您想要排序的值,但是您需要确保比较器处理唯一的值。所以我们做了一个值和键的向量

泰勒建议的上述方法不适用于非均匀值。我又添加了一个ordnen 4条目。

(def my-map {1 {:foo "String_1" :ordnen 5}
             2 {:foo "String_2" :ordnen 4}
             3 {:foo "String_2" :ordnen 4}
             4 {:foo "String_3" :ordnen 3}
             5 {:foo "String_4" :ordnen 1}})


(into (sorted-map-by
       (fn [key1 key2]
         (compare (:ordnen (get my-map key1))
                  (:ordnen (get my-map key2)))))
      my-map)
缺少键为3的地图条目

{5 {:foo "String_4", :ordnen 1}, 4 {:foo "String_3", :ordnen 3}, 2 {:foo "String_2", :ordnen 4}, 1 {:foo "String_1", :ordnen 5}}

首先通过调用
val
从映射中获取值,然后在生成的子映射中,通过关键字拉出与
:ordnen
对应的值:

(sort-by (comp :ordnen val) my-map)

这是一个很好的解决方案,简洁明了。只是有点吹毛求疵,op说他想要的是一个排序映射,但这给了你一个向量序列。排序映射:(into{}(sort by(comp:ordnen val)my map))你也可以提供一个比较器作为排序依据的第二个参数。假设您想要排序:ordnen以降序方式。(进入(分类地图)(排序方式(comp:ordnen val)>我的地图))Thx,问题:为什么“[(进入我的地图[key1:ordnen])key1]”而不仅仅是“(进入我的地图[key1:ordnen])”?因为分类地图在引擎盖下的工作方式。如果提供用于比较的任何键相等,则在构建结果排序的映射时,它们会像重复使用assoc一样进行处理。因此,这里存在数据丢失的可能性。例如,如果执行(->{}(assoc:a1)(assoc:a2)),则:a处的值1将被2覆盖。我们确保要比较的参数是唯一的,因此我们使用向量对:ordnen值和映射项的键(键1和键2保证是唯一的,因此[ordnen val key1]和[ordnen val key2]也是唯一的。