从 kotlin 的地图中查找所有最大条目?

pix*_*xel 3 dictionary max kotlin

我想找到具有最大值的所有条目。

我来到了:

val myMap = mapOf<Int, Int>(...)
val maxEntries = myMap.maxBy { it.value }
        ?.let { max -> myMap.filter { it.value == max.value } }
        ?.entries
        ?: emptySet()
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更惯用的解决方案。

Rol*_*and 5

您可以将您所拥有的简化为以下内容:

val maxValue = myMap.values.maxOrNull() // or max() depending on Kotlin version
val maxEntries = myMap.filterValues { it == maxValue }
Run Code Online (Sandbox Code Playgroud)

这样你就可以保留Map<Int, Int>- 类型,我认为这样更具可读性。请注意,maxValue存在null并没有真正的伤害,因为只有null当地图为空时您才会得到...过滤然后在空地图上仍然返回空地图。这可能也是该解决方案唯一*不好的部分。如果您有一个空地图,则此变体会在以下情况下构造一个新的空地图:filterValues调用时会构造一个新的空映射。

如果您介意这一点,那么以下内容更合适:

val maxEntries = myMap.values.maxOrNull()?.let { maxValue -> 
    myMap.filterValues { it == maxValue }
} ?: emptyMap()
Run Code Online (Sandbox Code Playgroud)

* 除了迭代地图两次之外唯一不好的部分。如果你想克服这个问题,那么我认为你必须实现自己的特定函数来处理这两个问题,同时检查最大值和收集。