在Kotlin中将地图的值加1

我正在写一个函数来遍历一个集合,并find其中最常见的项目。

这是我到目前为止获取的值,并添加它们出现在集合中的次数。 我将这个值作为一个关键字放入一个地图中,并把它的值显示为它的值。

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() } 

如果密钥已经存在,我无法find将值1加1的方法。

我试过这样做:

 newMap[item] +=1 

但是我得到一个关于plusAssign(1)不允许在Nullable接收器上的错误。

正如您已经注意到的那样,这个错误与可空性处理有关。 我建议没有明确的循环,但简单的分组更多的function的方法:

 val numbersByElement = input.groupingBy { it }.eachCount() //gives something like this {1=3, 2=5, 3=4, 5=2, 4=1} 

结果是一个Map,其中input的元素为键,元素的出现次数为相应的值。

你现在可以用maxByfind最常用的元素:

 numbersByElement.maxBy { it.value }?.key // gives an Int? 

Map.get返回一个Int? ,即如果没有find项目,则返回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应用到旧值和新值,在我们的例子中,将旧值添加到新值,并将结果存储在键下。

我在Kotlin做了一些关于null安全性的研究,我假设我的错误来自于newMap.get(item)可能为空的事实。

所以这是我更新的工作代码:

 for (item in input) { if (newMap.containsKey(item)) { newMap.set(item, newMap.get(item)!! +1) }else newMap.put(item, 1) } 

加入!! ,它会将该值转换为非nulltypes,如果为null,则会抛出一个错误,从而允许向该值添加1。