返回最高键值在Clojure中的数组映射内部

时间:2014-10-03 19:27:38

标签: sorting clojure array-map

我有一个返回以下数组映射的函数:

{{498 3} {-498 3}, {99 2} {-99 2}, {499 2} {-499 2}, {100 1} {-100 1}}

我想返回2,因为它有最高的关键,499。 这是最好的方法吗?

5 个答案:

答案 0 :(得分:2)

如果您的地图很大,这不是最有效的方式,但它有效:

(def am {{498 3} {-498 3}, {99 2} {-99 2}, {499 2} {-499 2}, {100 1} {-100 1}})

(->> am (map key) (sort-by first) last vals first) 

=> 2

答案 1 :(得分:1)

((comp val first key)
 (apply max-key
        (comp key first key)
        {{498 3} {-498 3}, {99 2} {-99 2}, {499 2} {-499 2}, {100 1} {-100 1}}))

这会找到具有最高第一个键的地图中第一个(通过spec唯一?)条目的值。

答案 2 :(得分:1)

如果您想表示数字之间的关系,您不需要地图地图。你可能需要这样一张地图:

user> (def foo {498 3, -498 3, 99 2, -99 2, 499 2, -499 2, 100 1, -100 1})
;; => #'user/foo

这是更惯用的方式,相信我,所以可能你应该考虑重写返回地图地图(或地图矢量)的函数。

要解决您的实际问题,请尝试使用max-key,因为它是专门为此类情况创建的高效功能。以下是如何将它与地图一起使用的方法:

user> (second (apply max-key first foo))
;; => 2

答案 3 :(得分:0)

在您的问题中,您会显示一张地图,其中地图为关键字和值。但似乎你想要像正常序列中的元素那样处理键和值,所以我猜你实际上意味着以下内容:

[{498 3} {-498 3} {99 2} {-99 2} {499 2} {-499 2} {100 1} {-100 1}]

在这种情况下,此函数返回您希望的值:

(defn val-for-highest-key
  [s]
  (->> s (map #(into [] %)) (map first) (apply max-key first) second))

试验:

(def res [{498 3} {-498 3} {99 2} {-99 2} {499 2} {-499 2} {100 1} {-100 1}])
(val-for-highest-key res)

结果:

=> 2

答案 4 :(得分:0)

试试这个:

(let [fval (comp val first)
      fkey (comp key first)]
  (fval
   (reduce
    (fn [v e] (if (< (fkey v) (fkey e)) e v))
    (keys {{498 3} {-498 3}, {99 2} {-99 2}, {499 2} {-499 2}, {100 1} {-100 1}}))))