【问题标题】:Getting the maximum key value pair in a Scala map by value按值获取Scala映射中的最大键值对
【发布时间】:2017-02-04 09:41:50
【问题描述】:

我正在尝试从地图中提取最大值及其键。例如:

val map = Map('a' -> 100, 'b' -> 23, ... 'z' -> 56)

其中 100 是最大值,我将如何拉 ('a',100)?我本质上想使用 Map.max 但按值而不是键搜索。

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    您可以将maxBy 与键值对中的函数一起使用到值:

    val map = Map('a' -> 100, 'b' -> 23, 'z' -> 56)
    
    map.maxBy(_._2)  // (a,100)
    

    这是一个简写形式

    map.maxBy { case (key, value) => value }
    

    【讨论】:

    • 完美,可行!我不得不问,你从哪里得到传递给 maxBy() 的谓词的语法?
    • 如果你查看API docs,你会发现Map[A, B]def maxBy[C](f: ((A, B)) ⇒ C)(implicit cmp: Ordering[C]): (A, B) - 恐怕文档格式被破坏了,所以我在这里用新类型写了正确的表格参数C。因此,您将 (key, value) 元组中的函数传递给存在排序的任何其他值。 map.maxBy(_._2)map.maxBy { case (key, value) => value } 的简写形式。
    • 嗨,如果 100 存在多个键怎么办?是否有可能获得所有值而不仅仅是一个?谢谢!
    • @Victor 你会先确定最大值,然后过滤地图;例如val map = Map('a' -> 100, 'b' -> 23, 'z' -> 56, 'c' -> 100); val maxVal = map.valuesIterator.max; map.filter(_._2 == maxVal)
    【解决方案2】:

    如果您要查找的最大值在地图中多次出现,请稍作修改:

    // Find the entries with the max value in the map
    val maxValue = map.maxBy(item => item._2)
    
    // Filter the map and retain the entries with the max value
    map.filter(item => item._2 == maxValue._2)
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多