Kotlin - 如何对矩阵的每个元素应用模运算?

EMa*_*ual 2 kotlin

我发现 Kotlin 中的 Lambda 非常混乱,最重要的是“它”。关于“它”,我知道两件事,即

  • 如果您的 Lambda 有自己的参数,您可以将其名称替换为“it”。
  • “它”是为您的 Lambda 自动生成的名称,如果它只有一个参数,并且您没有指定不同的参数名称。

我仍然不明白什么是“它”。

例如,我想对3x3矩阵的每个元素应用模函数。

fun main(){
    var result = Array(3) {
        IntArray(3) { 3;2;4;6;7;9;12;11;23 }
    }

    result = Array(3){ IntArray(3) {it%2} }

    println(result.joinToString("\n") { it.joinToString(" ") })
}
Run Code Online (Sandbox Code Playgroud)

在这里,我假设“它”采用矩阵的每个元素,这显然不是我的输出情况:

0 1 0
0 1 0
0 1 0
Run Code Online (Sandbox Code Playgroud)

那么你能解释一下“它”是如何工作的,这里发生了什么?实施该计划的正确方法是什么?

Ten*_*r04 5

你的线路

result = Array(3){ IntArray(3) {it%2} }
Run Code Online (Sandbox Code Playgroud)

result指向的原始 Array 没有做任何事情。您正在通过调用ArrayIntArray 构造函数来创建一组全新的数组对象。

您传递给IntArray 构造函数的 lambda有一个表示数组索引的输入参数,您的 lambda 的返回值将被放入该索引处的数组中。所以在这种情况下it是数组索引,你的 lambda 分别为偶数和奇数索引返回 0 和 1。

您也开始错误地实例化您的数组。您传递给该IntArray构造函数的lambda丢弃了一堆毫无意义的 Int 值,然后为每个项目返回 23。因此,您创建了一个 3x3 矩阵,其中完全填充了数字 23。

创建具有显式值的数组的正确语法是使用arrayOfor intArrayOf

val result = arrayOf(
    intArrayOf(3, 2, 4),
    intArrayOf(6, 7, 9),
    intArrayOf(12, 11, 23)
)
Run Code Online (Sandbox Code Playgroud)

要修改数组的所有值,您通常以传统方式迭代,而不是使用 lambda:

for (innerArray in result) {
    for (i in innerArray.indices)
        innerArray[i] = innerArray[i] % 2
}
Run Code Online (Sandbox Code Playgroud)

您可能正在考虑该map函数,它允许您传递一个 lambda 并返回一个新的 List,其中 lambda 函数应用于输入集合的每个元素。或者,在处理数组以外的集合时,您可以使用forEachonEach迭代它们而无需修改它们。