Kotlin - 如何创建动态矩阵?

EMa*_*ual 3 kotlin

我想创建一个大小矩阵,nxn其中 n 是 input 的长度message:String。到目前为止,这是我想到的唯一解决方案,它也有四个 for 循环。

fun main(){
println("Enter the message:")
var message:String = readLine().toString()
var cipher = Array(message.length) { Array<Int>(message.length) {0} }
for(i in 0 .. (message.length - 1)){
    for(j in 0 .. (message.length - 1)){
        cipher[i][j] = readLine()!!.toInt()
    }
}
//print the matrix
for(i in 0..(message.length -1)){
    for(j in 0..(message.length -1)){
        print(cipher[i][j])
    }
    println()
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的代码?如何改进此代码?

Moi*_*ira 7

假设您的输入数据是row-major,这可以通过将数组填充逻辑移动到数组创建本身来简化:

var cipher = Array(message.length) {
    IntArray(message.length) { readLine()!!.toInt() }
}
Run Code Online (Sandbox Code Playgroud)

Array的构造函数采用一个初始化函数,该函数被调用size多次以填充数组。通过在此处读取用户输入,您可以在创建矩阵时填充数组,避免编写额外的循环。


其他注意事项:

  • readLine().toString()是多余的并且可能有害。readLine返回 a String?,然后你调用Any?.toString它,它要么返回Any.toString其接收者不为空的结果,要么返回文字字符串"null"(这可能是不需要的。)
  • until在循环数组 ( 0 until length)时考虑使用中缀函数,而不是0..(length - 1)(或者更好的是使用Array.indices扩展属性。)
  • 考虑使用相应的基本数组的类型(即IntArrayFloatArray等而非Array<*>

也可以看看:

您还可以通过简化代码来完全避免输出循环:

println(cipher.joinToString("\n") { row -> row.joinToString("") })
Run Code Online (Sandbox Code Playgroud)

这是一段更简单的代码:

fun main() {
    println("Enter the message:")
    
    var message = readLine()!!
    var cipher = Array(message.length) {
        IntArray(message.length) { readLine()!!.toInt() }
    }
    
    println(cipher.joinToString("\n") { it.joinToString("") })
}
Run Code Online (Sandbox Code Playgroud)