为什么会出现错误:kotlin中的期望值可变?

时间:2019-07-17 01:42:48

标签: kotlin

我试图编写一个函数来查找kotlin中的多数元素,但是当我编译代码时,我在下一行得到了可变的预期错误

                   map[key]?.let{ value->

下面是我要运行的功能。我是Kotlin的新手,不确定为什么会收到此错误。

fun majorityElement(nums: IntArray): Int {
        HashMap<Int,Int>().let{ map ->
                nums.forEach{ key->        
                   map[key]?.let{ value->
                        map[key]=value+1
                    }?:map[key]=1

                }
                map.forEach{entry->
                    if(entry.value>nums.size/2){
                        return entry.key
                    }
                }
        }
        return -1
    }

1 个答案:

答案 0 :(得分:3)

基本上,问题出在这部分:

map[key]?.let { ... } ?: map[key] = 1

这里,表达式的解析不是您期望的那样。 map[key]?.let { ... } ?: map[key]成为赋值运算符的l值,1成为r值。

赋值的l值必须是您可以为其赋值的值,即变量,属性,索引器,例如map[key] =,但这是一个复杂的表达式  map[key]?.let { ... } ?: map[key]

如果只想在map[key]为空时执行赋值,则可以将该语句包装在run函数中:

map[key]?.let { ... } ?: run { map[key] = 1 }

也许用以下方法重写此块会更清楚:

// get value associated with key or 0 if there is none.
map[key] = map.getOrElse(key, { 0 }) + 1

从更高的角度看,似乎需要计算一个整数数组中数字的出现次数。在这种情况下,可以使用带有groupingBy and eachCount函数的更高级方法:

val map = nums.asList().groupingBy { it }.eachCount()

// then find the majority in this map