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_Treemap_Sortedmap - Fatal编程技术网

Clojure中最高键的返回值

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) 我希望这有帮助

我正在处理这两组键值对,它们由另一个函数返回。我想写一个函数,它总是找到最高的键并返回它相应的值。在本例中,我将返回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)
我希望这有帮助。谢谢

({-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]