我想编写一个程序来根据用户输入计算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)
}
答案 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。虽然第一个版本会忽略它,但在这里我们将其称为row
或columns
,因此我们可以使用它来索引要求和的数组。
以上假设所有内部数组的大小均相同。在这种情况下,这可能是合理的,您是在这里自己创建数组的-但总的来说,您可能需要验证一下。
当然,最好确认要添加的两个矩阵的大小相同,并抛出IllegalArgumentException并提供有用的消息(如果不是)。否则,您将得到ArrayIndexOutOfBoundsException(如果第一个较大),或者值将被静默截断(如果第二个较大)–两者都将很难追踪。
(这里的根本问题是,像大多数语言一样,Kotlin没有真正的二维数组。它的确是数组的数组,数组更灵活-因此更危险。正确地,您可能会将数组数组包装到自己的Matrix类中,该类将始终确保数据正确地矩形化,提供对行和列计数的访问,并进行所有必要的检查。)