作者:归零xinghx_318 | 来源:互联网 | 2022-12-30 12:52
我正在编写一个迭代一个集合的函数,并找到其中最常见的项目.
以下是我到目前为止获取值并添加它们在集合中出现的次数.我将值作为键放在地图中,并将其显示为其值的次数.
fun mostCommon(input: Collection): Set {
var newMap: MutableMap = HashMap()
for (item in input) {
if (newMap.containsKey(item)) {
//TODO: add 1 to value if key is found
}else {
newMap.put(item, 1)
}
}
return emptySet()
}
如果密钥已存在,我无法找到将值加1的方法.
我试过这样做:
newMap[item] +=1
但我得到一个关于plusAssign(1)的错误,不允许在Nullable接收器上.
1> s1m0nw1..:
正如您已经注意到的那样,错误与可空性处理有关.我建议一个更实用的方法,没有明确的循环,但简单的分组:
val numbersByElement = input.groupingBy { it }.eachCount()
//gives something like this {1=3, 2=5, 3=4, 5=2, 4=1}
结果是一个Map,其中元素input
作为其键,元素的出现次数作为相应的值.
您现在可以找到最常见的元素maxBy
:
numbersByElement.maxBy { it.value }?.key // gives an Int?
2> Kirill Rakhm..:
Map.get
返回一个Int?
,即如果没有找到任何项目,null
将返回.您可以使用elvis运算符来处理:
val newMap = mutableMapOf()
for (item in input) {
newMap[item] = (newMap[item] ?: 0) + 1
}
另一种方法是使用Java 8 Map.merge
:
newMap.merge(item, 1) { i, j -> i + j }
// or the equivalent
newMap.merge(item, 1, Int::plus)
1
如果密钥尚未存在,这将放入映射中,否则将lambda应用于旧值和新值,在我们的示例中,将旧值添加到新值并将结果存储在键下.