Clojure中最高键的返回值
我正在处理这两组键值对,它们由另一个函数返回。我想写一个函数,它总是找到最高的键并返回它相应的值。在本例中,我将返回2,因为499是最高键。我正在处理的数据是Clojure中最高键的返回值,clojure,treemap,sortedmap,Clojure,Treemap,Sortedmap,我正在处理这两组键值对,它们由另一个函数返回。我想写一个函数,它总是找到最高的键并返回它相应的值。在本例中,我将返回2,因为499是最高键。我正在处理的数据是 ({-99 0, 99 0} {-99 2, 499 2}) 当我打电话时 (type ({-99 0, 99 0} {-99 2, 499 2})) 在负责返回数据的函数中,我返回 (clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeMap) 我希望这有帮助
({-99 0, 99 0} {-99 2, 499 2})
当我打电话时
(type ({-99 0, 99 0} {-99 2, 499 2}))
在负责返回数据的函数中,我返回
(clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeMap)
我希望这有帮助。谢谢 ({-990,990}{-9924992})
是一个查找操作,其中{-990,990}
是一个字典,{-9924992}
是一个键。由于后者不是前者的键,因此表达式将返回nil
当我计算(type({-990,990}{-9924992}))
时,我得到nil
,因为nil
的类型也是nil
(as-> (apply merge pair)
merged
(->> merged
keys
(apply max)
merged))
请注意,当两个映射都有一个“最高”键时,将返回第二个键的值。这是
max key
的一个很好的用例(请参阅它的一个很好的使用示例),我认为它有一种误导性的名称——它实际上是接受一个函数和一个集合,它返回集合中对该项应用函数的结果最高的项。您可以使用函数key
,该函数返回键值对的键
(请注意,您需要将映射合并在一起,以便使用单个键值对集合。)
编辑:
误解了所需的返回值此函数将在对数时间内返回Clojure排序映射的最右侧条目(内置实现称为
Clojure.lang.PersistentTreeMap
):
(defn rightmost
"Takes a Clojure sorted map sm and returns the entry at the greatest
key (as determined by sm's comparator)."
[sm]
(first (rseq sm)))
例如:
(rightmost (sorted-map 1 1 2 2 3 3))
;= [3 3]
然后,您可以使用val
函数提取该值
所有基于max键的/应用max
解决方案都在线性时间内工作。不用说,这是一个巨大的差异
如果可以说服另一个函数返回映射,则可以使用nth
在对数时间内的任何索引处访问元素:
;; works for data.avl sorted maps, not the built-ins
(nth (avl/sorted-map 1 1 2 2 3 3) 2)
;= [3 3]
这不是一个操作,它是一个列表,“由另一个函数返回”。显然,你的意思是(映射类型对)
如何解析重复的最大密钥?(val代表最大密钥({-990,995000}{-9924992}));=>5000
我注意到,当存在重复键时,将选择最右边的值<代码>(应用最大密钥(concat{-9904990}{-9924992}));=>[499 2]
你说得对。。。如果最右边的键不是具有最高值的键,这将导致问题。有趣的是,(concat{-9904995}{-9924992})
本身返回一个包含重复键的列表:([-990][4995][992][4992])
。但是,在上面执行(apply max key key…
似乎会将这些键强制转换为java.util.Map$Entry
键值对,并通过使用最右边的键值对来消除重复项,您得到的答案是不正确的(注意,我将最左边的键值改为>2)[499 2]
。实际上,在进一步审查后,[499 2]
从技术上讲并不错误——OP只是在寻找一种方法来返回最高键的值,即499。那么,问题是该键有两个值。无论如何,我仍然认为max key
是一个很好的解决方案,假设您使用的是一个没有重复键的映射。没错,这是正确的。(这就是我没有否决投票的原因;-)我只想说明一个实现细节,因为如果存在重复的max键,则有不止一个答案。您的算法以特定的方式解决这个问题,即使它恰好是一个子实现细节!我喜欢你的思维方式!:)
(rightmost (sorted-map 1 1 2 2 3 3))
;= [3 3]
;; works for data.avl sorted maps, not the built-ins
(nth (avl/sorted-map 1 1 2 2 3 3) 2)
;= [3 3]