为什么我在 kotlin 中收到错误:变量期望?

OkD*_*oid 2 kotlin

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

                   map[key]?.let{ value->
Run Code Online (Sandbox Code Playgroud)

下面是我正在尝试运行的函数。我是 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
    }
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 5

基本上问题就出在这一部分:

map[key]?.let { ... } ?: map[key] = 1
Run Code Online (Sandbox Code Playgroud)

这里表达式的解析方式与您想象的不同。map[key]?.let { ... } ?: map[key]成为赋值运算符的左值并1成为右值。

赋值的左值必须是可以赋值的东西,即变量、属性、索引器,例如map[key] =,但这里它是一个复杂的表达式 map[key]?.let { ... } ?: map[key]

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

map[key]?.let { ... } ?: run { map[key] = 1 }
Run Code Online (Sandbox Code Playgroud)

也许按以下方式重写此块会更清楚:

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

从更高的角度来看,似乎需要统计整数数组中数字的出现次数。对于这种情况,可以使用带有groupingByeachCount函数的更高级方法:

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

// then find the majority in this map
Run Code Online (Sandbox Code Playgroud)