Kotlin 计算二维数组的和
我想写一个程序,根据用户输入计算两个矩阵(2D数组)的和 两个矩阵的行数和列数必须相等。两个矩阵A和B之和将是一个矩阵,其行数和列数与A和B相同 标准输入的第一行是矩阵a的行数n和列数m。接下来的n行是矩阵的元素。空行后的下一行是矩阵B的若干行n和若干列m。下一行n是矩阵B的元素 我想输出a和B矩阵之和的结果,或者如果不可能,则输出错误消息。输入仅包含整数 示例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
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]
}
}