我想找到所有具有最大值的条目。
我来了:
val myMap = mapOf<Int, Int>(...)
val maxEntries = myMap.maxBy { it.value }
?.let { max -> myMap.filter { it.value == max.value } }
?.entries
?: emptySet()
但我想知道是否还有更多惯用的解决方案。
最佳答案
您可以简化您的操作,如下所示:
val maxValue = myMap.values.max()
val maxEntries = myMap.filterValues { it == maxValue }
这样,您可以保留
Map<Int, Int>
-type,我认为这种方式更具可读性。请注意,将maxValue
转换为null
并不会真正造成伤害,因为如果 map 为空,您只会得到null
...过滤然后在空白 map 上仍然会返回空白 map 。这可能也是该解决方案的唯一缺点。如果您有一个空映射,则在调用filterValues
时,此变体将构造一个新的空映射。如果您介意,那么以下更合适:
val maxEntries = myMap.values.max()?.let {
maxValue -> myMap.filterValues { it == maxValue }
} ?: emptyMap()
*除了遍历 map 两次之外,唯一的坏部分。如果您想克服这个问题,那么我认为您必须实现自己的特定功能,同时处理这两个问题,即检查最大值并收集。