Kotlin 计算二维数组的和

Kotlin 计算二维数组的和,kotlin,Kotlin,我想写一个程序,根据用户输入计算两个矩阵(2D数组)的和 两个矩阵的行数和列数必须相等。两个矩阵A和B之和将是一个矩阵,其行数和列数与A和B相同 标准输入的第一行是矩阵a的行数n和列数m。接下来的n行是矩阵的元素。空行后的下一行是矩阵B的若干行n和若干列m。下一行n是矩阵B的元素 我想输出a和B矩阵之和的结果,或者如果不可能,则输出错误消息。输入仅包含整数 示例 Input: 4 5 1 2 3 4 5 3 2 3 2 1 8 0 9 9 1 1 3 4 5 6 4 5 1 1 4 4 5 4

我想写一个程序,根据用户输入计算两个矩阵(2D数组)的和

两个矩阵的行数和列数必须相等。两个矩阵A和B之和将是一个矩阵,其行数和列数与A和B相同

标准输入的第一行是矩阵a的行数n和列数m。接下来的n行是矩阵的元素。空行后的下一行是矩阵B的若干行n和若干列m。下一行n是矩阵B的元素

我想输出a和B矩阵之和的结果,或者如果不可能,则输出错误消息。输入仅包含整数

示例

Input:
4 5
1 2 3 4 5
3 2 3 2 1
8 0 9 9 1
1 3 4 5 6
4 5
1 1 4 4 5
4 4 5 7 8
1 2 3 9 8
1 0 0 0 1

Output:
2 3 7 8 10
7 6 8 9 9
9 2 12 18 9
2 3 4 5 7
我的代码:

package processor

import java.util.*

val scanner = Scanner(System.`in`)

fun main() {
    MatrixProcessor().addition()
}

class MatrixProcessor {

    private fun createMatrix(): Array<Array<Int>> {
        val rows = scanner.nextInt()
        val columns = scanner.nextInt()
        return Array(rows) {Array(columns) { scanner.nextInt()} }
    }

    fun addition() {
        val firstMatrix = createMatrix()
        val secondMatrix = createMatrix()

        val sum = Array(4) { IntArray(5) }

        for (i in 0 until 4) {
            for (j in 0 until 5) {
                sum[i][j] = firstMatrix[i][j] + secondMatrix[i][j]
            }
        }
        printSolution(sum)
    }

    private fun printSolution(matrix: Array<IntArray>) {
        for (array in matrix) {
            for (value in array) {
                print("$value ")
            }
            println()
        }
    }
}

据我所知,您的问题是必须为数组设置一个固定的大小。我建议您使用ArrayList来解决这个问题

使用此解决方案,您不再需要为总和设置大小


一旦你使用了ArrayList,你就再也不会回到数组了。

看起来你是在按行的主要顺序存储你的矩阵:你有单独的数组代表行,然后一个外部数组容纳所有行。因此外部数组的大小给出了行的数量和任何内部数组的大小(如第一个)提供列数。

因此,您可以这样创建总和:

val sum = Array(firstMatrix.size) { IntArray(firstMatrix[0].size) }
for (i in sum.indices)
    for (j in sum[0].indices)
        sum[i][j] = firstMatrix[i][j] + secondMatrix[i][j]
(为了简单起见,我使用了
.index
而不是显式范围。)

另一种方法是在创建数组时指定值,而不是在之后填充它们(这里没有太大区别,因为数字数组的默认值为0;但在创建不可为null的引用类型的数组时,它可以大大简化工作。)

Array()和IntArray()构造函数将索引传递到lambda;而第一个版本忽略它,这里我们称它为
,因此我们可以使用它来索引正在求和的数组


以上假设所有内部数组都具有相同的大小。在这种情况下,这可能是合理的,因为您自己创建了数组,但通常您可能希望验证这一点

当然,最好验证要添加的两个矩阵是否大小相同,如果没有,则抛出一个带有有用消息的IllegalArgumentException。否则,您要么得到ArrayIndexOutOfBoundsException(如果第一个较大),要么得到静默截断的值(如果第二个较大)-这两种情况都很难找到


(这里的根本问题是,与大多数语言一样,Kotlin没有真正的二维数组。它所拥有的是数组数组数组,这更灵活,因此也更危险。如果操作得当,您可能会将数组数组包装到自己的矩阵类中,这将始终确保数据作为正确的矩形,提供对行和列计数的访问,并进行所有必要的检查。)

谢谢,这非常有用!
val sum = Array(firstMatrix.size) { IntArray(firstMatrix[0].size) }
for (i in sum.indices)
    for (j in sum[0].indices)
        sum[i][j] = firstMatrix[i][j] + secondMatrix[i][j]
val sum = Array(firstMatrix.size) { row ->
    IntArray(firstMatrix[0].size) { column ->
        firstMatrix[row][column] + secondMatrix[row][column]
    }
}