繁体   English   中英

Kotlin - 如何创建动态矩阵?

[英]Kotlin - How to create a dynamic matrix?

我想创建一个大小为nxn的矩阵,其中 n 是输入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()
   }
}

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

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

var cipher = Array(message.length) {
    IntArray(message.length) { readLine()!!.toInt() }
}

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


杂项说明:

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

也可以看看:

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

println(cipher.joinToString("\n") { row -> row.joinToString("") })

这是一段更简单的代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM