我已經嘗試了這 10 種不同的方法,但我無法讓它發揮作用。我希望這個 Kotlin 代碼接收一個字串,對照一個 listOf 字符檢查該字串的每個字符,如果它在該串列中,則將一個計數變數增加 1,因此最后它可以檢查該計數變數是否高到可以通過測驗。這直接取自 Sololearn:代碼教練 - 密碼驗證器。我已經在 Python ( https://code.sololearn.com/c0fl17IMHPfC ) 中成功完成了這段代碼,但是在嘗試將其轉換為 Kotlin 時,它似乎不起作用。與 listOf 中的元素相比,這些變數似乎沒有注冊為 true。
fun main() {
var password: String = readLine()!!
var numberCount: Int = 0
var numbers: List<String> = listOf("0","1","2","3","4","5","6","7","8","9")
var specialCount: Int = 0
var specialCharacters: List<String> = listOf("!","@","#","$","%","&","*")
if (password.length < 7) {
println("Weak")
} else {
for (character in password) {
println(character)
var numberCheck = numbers.contains(character)
println(numberCheck)
if (numberCheck == true) {
numberCount = 1
}
var specialCharactersCheck = specialCharacters.contains(character)
println(specialCharactersCheck)
if (specialCharactersCheck == true) {
specialCount = 1
}
}
println(numberCount)
println(specialCount)
if (numberCount < 2) {
println("Weak")
} else if (specialCount < 2) {
println("Weak")
} else {
println("Strong")
}
}
}
當我輸入“letssee43$#”時,這段代碼的結果是:
l 假 假 e 假 假 t 假 假 s 假 假 s 假 假 e 假 e 假 假 4 假 假 3 假 假 $ 假 假
false false 0 0 弱
型別推斷失敗。型別引數 T 的值應在輸入型別(引數型別、接收者型別或預期型別)中提及。嘗試明確指定它。型別推斷失敗。型別引數 T 的值應在輸入型別(引數型別、接收者型別或預期型別)中提及。嘗試明確指定它。
uj5u.com熱心網友回復:
您的串列是Strings 的串列,但在s 中for (character in password)回圈。因此,您正在嘗試查看串列中的一個 s 是否是特定的,但事實并非如此,因為它們是兩種不同的型別-其中包含單個字符的字串仍然是 a ,而不是 a (這就是為什么你得到那個型別錯誤)CharpasswordStringCharStringChar
有很多方法可以做到這一點(除了Char/之外,您的代碼沒有任何問題String!),我個人會這樣做:
var numbers = "0123456789"
var specialCharacters = "!@#$%&*"
val password = "letssee43$#"
val nums = password.count { it in numbers }
val specials = password.count { it in specialCharacters }
println("nums: $nums, specials: $specials")
> nums: 2, specials: 2
count正在遍歷Chars inpassword并計算每個字串包含多少個。AString被視為 s 的陣列Char,因此您可以這樣檢查它。(如果你真的希望你的字符存盤在一個串列中,你也可以.toList()在字串宣告之后添加 - 這樣它將是一個List<Char>所以查找仍然有效。)
或者您可以按您的方式做事,并明確寫出listOf元素 - 但將它們Char改為 s,例如listOf('1')(單引號)而不是listOf("1")(雙引號)。
如果您確實想在字串串列中搜索匹配項,則需要提供 a String,因此您需要將您的轉換Char為一個,例如通過呼叫toString()它,使用類似 的文字等"$character"。
像gidds在下面指出的那樣進行編輯in,集合對于像or之類的查找更有效contains,所以這toSet()是一個更好的主意,toList()除非您出于某種原因確實需要該有序串列。如果您不關心效率(例如,如果您不進行大量查找),我個人會將其保留為字串,就像在上面的代碼塊中一樣-它既好又簡單。但是,如果您確實想提高效率,或者確實需要一個集合(例如,如果您要與Strings 匹配),那么 aSet是理想的
uj5u.com熱心網友回復:
我將為您提供另一種使用 Extensions 獲得與您相同的結果的方法
fun main() {
var password: String = readln()
println("Password contain numbers amount: " password.containNumbersAmount())
println("Password contain special characters amount: " password.containSpecialCharactersAmount())
println("Password Status : " password.validationResult())
}
fun String.containNumbersAmount() = count { it.isDigit() }
fun String.containSpecialCharactersAmount(): Int {
val specialCharacters = "!@#$%&*"
return count { it in specialCharacters } }
fun String.validationResult() : String {
return when {
length < 7 -> "Weak"
containNumbersAmount() < 2 -> "Weak"
containSpecialCharactersAmount() < 2 -> "Weak"
else -> "Strong"
} }
uj5u.com熱心網友回復:
問題是你的串列包含字串,所以每次你呼叫contains它們并傳遞一個字符時,它總是錯誤的,因為字符不是字串。
可能修復它的最好方法是宣告 Iterables of Chars 來檢查它們。串列是可迭代的,但范圍也是如此。
val password: String = readln()
var numberCount: Int = 0
val numbers: Iterable<Char> = '0'..'9'
var specialCount: Int = 0
val specialCharacters: List<Char> = listOf('!','@','#','$','%','&','*')
只是為了你的學習,有一個count函式接受一個 lambda 引數,可以使這種任務更容易:
fun main() {
val password: String = readln()
val numbers = '0'..'9'
val specialCharacters = listOf('!','@','#','$','%','&','*')
val numberCount: Int = password.count { numbers.contains(it) }
val specialCount: Int = password.count { specialCharacters.contains(it) }
val result = when {
password.length < 7 || numberCount < 2 || specialCount < 2 -> "Weak"
else -> "Strong"
}
println(result)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479648.html
標籤:科特林
