问题描述
仅用于上下文:我正在尝试实现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' } }
然后,您可以使用all
和contentEquals
来检查内部的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")
}