【问题标题】:Kotlin - How to create a dynamic matrix?Kotlin - 如何创建动态矩阵?
【发布时间】:2020-08-10 07:37:08
【问题描述】:

我想创建一个大小为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()
   }
}

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

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

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


    杂记:

    • readLine().toString() 是多余的并且可能有害。 readLine 返回一个String?,然后你在它上面调用Any?.toString,如果它的接收者不为空,它要么返回Any.toString 的结果,要么返回文字字符串"null"(这可能是not 需要。)
    • 在遍历数组时考虑使用 until 中缀函数 (0 until length),而不是 0..(length - 1)(或者更好的是 Array.indices 扩展属性。)
    • 考虑使用相应的原始数组类型(即IntArrayFloatArray 等而不是Array&lt;*&gt;

    另见:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多