在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
的元素为键,元素的出现次数为相应的值。
你现在可以用maxBy
find最常用的元素:
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。