我的任務是創建一個必須考慮一些事情的密碼驗證。我唯一的問題是密碼驗證的標準之一是密碼不能包含任何序列,例如(12345)、(abcdef)、(asdfghjk)。我已經搜索了很多,不知道如何實作。任何人都可以幫忙。
uj5u.com熱心網友回復:
由于您沒有詳細說明您已經擁有哪些代碼以及您對邏輯的堅持,這里有一個非常概括的策略描述,您可以用來執行此操作:
- 創建一個
List<Iterable<Char>>包含所有可能的字串的字串,這些字串可以被認為是一個范圍。例如:
val charRuns = listOf(
'0'..'9',
'a'..'z',
'A'..'Z',
"qwertyuiop".asIterable(),
//...
)
迭代這些運行以填充 a
MutableMap<Char, MutableSet<Char>>,其中鍵是運行中的任何字符,值是所有字符的集合,如果它們出現在字串中,則應將其視為連續序列。迭代潛在的密碼字串,使用映射檢查每個 Char 的后續 Char 以查看它是否應被視為序列的一部分。使用計數器變數來計算到目前為止找到的序列的當前大小,并在找到非序列時將其重置。如果它超過允許序列大小的閾值,請立即拒絕密碼。
uj5u.com熱心網友回復:
這就是我實作它的方式。我還檢查了沒有向后的序列,例如 (4321, dcba)。
private fun noSequenzes(password: String) : Boolean {
val charRuns = listOf(
'0'..'9',
'a'..'z',
'A'..'Z',
"qwertzuiop".asIterable(),
"asdfghjkl??".asIterable(),
"yxcvbnm".asIterable()
)
var map = emptyMap<Char, MutableSet<Char?>>()
charRuns.forEach { run ->
run.forEach { char ->
val charsToAdd = mutableSetOf(run.elementAtOrNull(run.indexOf(char) 1))
if (run is CharRange) {
charsToAdd.add(run.elementAtOrNull(run.indexOf(char) - 1))
}
if (map.contains(char)) {
map.get(char)!!.addAll(charsToAdd)
}
else {
map = map.plus(Pair(char, charsToAdd))
}
}
}
var sequenceCounter = 1
var recentChar: Char? = null
password.toCharArray().forEach { c ->
recentChar?.let { rc ->
val isSequence = map.any { me -> me.key == rc && me.value.contains(c) }
if (isSequence) {
sequenceCounter = sequenceCounter 1
}
else {
sequenceCounter = 1
}
if (sequenceCounter >= 3) {
return false
}
}
recentChar = c
}
return true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/484252.html
