Kotlin-如何检查矩阵中是否存在字符?

问题描述

仅用于上下文:我正在尝试实现Playfair Cipher。如果您看看Playfair Cipher来了解我的问题,将会非常有帮助。

该程序仅用于某些背景:

fun main(){
    println("Enter the message:")
    var message:String = readLine()!!.toupperCase()
    println("Enter the key:")
    var key:String = readLine()!!.toupperCase()

    var cipTable = Array(5){ Array(5){'X'}}

    var j=0; //to iterate througm my key

    for(innerArray in cipTable){
        for(i in innerArray.indices){
            if(key[j++] !in cipTable)
                innerArray[i]+=key[j]
            
            if(j==key.length) break
        }
    }
}

我的主要问题在于这部分:

for(innerArray in cipTable){
        for(i in innerArray.indices){
            if(key[j++] !in cipTable)

我想检查要插入矩阵中的key是否已经存在。我也不能使用innerArray而不是cipTable,因为它只会检查同一行中的char。有什么方法可以检查整个矩阵中是否存在字符?

例如:

fun main(){
    var result = arrayOf(
            intArrayOf(3,2,4),intArrayOf(6,7,9),intArrayOf(12,11,23)
    )
    
    //To check if 2 is present in the entire matrix/table
    if(result.any { 2 !in it}) println("not present") else print("present")
}

您能告诉我这段代码有什么问题吗,因为没有预期的输出。同样,我可以通过任何方式使用forEach。

解决方法

如果我理解正确,那么您希望此for循环根据任何内部数组是否具有与key字符串相同的字符序列和字符数来得出true或false。

首先,内部数组应该是CharArray而不是Array<Char>,以避免装箱。

val cipTable = Array(5) { CharArray(5) { 'X' } }

然后,您可以使用allcontentEquals来检查内部的CharArray是否与键匹配。

val charArrayKey = key.toCharArray()
val isKeyInTable = cipTable.any { it.contentEquals(charArrayKey) }

如果您想跳过将密钥转换为CharArray的步骤,可以像这样手动检查它:

val isKeyInTable = 
    cipTable.any { it.size == key.length && it.withIndex().all { (i,c) -> c == key[i] } }
,

我想一种方法是使用扩展名。

fun Array<IntArray>.has(x:Int):Boolean{
    for(innerArray in this){
        if(x in innerArray)
            return true
    }
    return false
}

fun main(){
    var result = arrayOf(
            intArrayOf(3,2,4),intArrayOf(6,7,9),intArrayOf(12,11,23)
    )

    //To check if 43 or 4 is present in the entire matrix/table
    if(result.has(43)) println("present") else println("not present")
    if(result.has(4)) println("present") else println("not present")
}