计算二维数组的总和

时间:2020-09-16 09:56:36

标签: kotlin

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

两个矩阵必须具有相等数量的行和列才能添加。两个矩阵A和B的总和将是与A和B具有相同行和列数的矩阵。

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

我想输出A和B矩阵之和的结果,或者如果可能的话输出ERROR消息。输入仅包含整数。

示例

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()
        }
    }
}

我的主要问题在于加法函数中的sum,因为我不知道如何用动态行和列的大小来填充它,并且当前插入的标准值为4和5。

    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)
    }

2 个答案:

答案 0 :(得分:0)

据我了解,您的问题是必须为Array设置固定大小。我建议您改用ArrayList来解决问题。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/

使用此解决方案,您无需再设置总和的大小。

一旦使用ArrayList,就永远不会回到Arrays。

答案 1 :(得分:0)

看起来您是以行优先的顺序存储矩阵的:您有代表行的单个数组,然后有一个包含所有行的外部数组。因此,外部数组的大小为您提供行数,而任何内部数组(例如第一个)的大小为您提供列数。

所以您可以这样创建总和:

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]

(为简单起见,我使用了.indices而不是显式范围。)

另一种方法是在创建数组时指定值,而不是事后填写它们。 (由于数值数组的默认值为0,所以在这里并没有太大区别;但是在创建非空引用类型的数组时,它可以简化很多事情。)

val sum = Array(firstMatrix.size) { row ->
    IntArray(firstMatrix[0].size) { column ->
        firstMatrix[row][column] + secondMatrix[row][column]
    }
}

Array()和IntArray()构造函数将索引传递给lambda。虽然第一个版本会忽略它,但在这里我们将其称为rowcolumns,因此我们可以使用它来索引要求和的数组。


以上假设所有内部数组的大小均相同。在这种情况下,这可能是合理的,您是在这里自己创建数组的-但总的来说,您可能需要验证一下。

当然,最好确认要添加的两个矩阵的大小相同,并抛出IllegalArgumentException并提供有用的消息(如果不是)。否则,您将得到ArrayIndexOutOfBoundsException(如果第一个较大),或者值将被静默截断(如果第二个较大)–两者都将很难追踪。

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