密码验证无字符序列(kotlin android studio)

password validation no Character sequence ( kotlin android studio )

我的任务是创建一个必须考虑一些事情的密码验证。我唯一的问题是密码验证的标准之一是密码不能包含任何序列,例如(12345)、(abcdef)、(asdfghjk)。我已经搜索了很多,不知道如何实现。谁能帮忙。

由于您没有详细说明您已经拥有的代码以及您对逻辑的坚持,这里是您可以用来执行此操作的策略的非常笼统的描述:

  1. 创建一个 List<Iterable<Char>>,其中包含可以被视为一个范围的所有可能的字符串。例如:
    val charRuns = listOf(
        '0'..'9',
        'a'..'z',
        'A'..'Z',
        "qwertyuiop".asIterable(),
        //...
    )
  1. 迭代这些运行以填充 MutableMap<Char, MutableSet<Char>>,其中键是运行中的任何字符,值是所有字符的集合,如果它们出现在下一个字符串应该被认为是一个连续的序列。

  2. 迭代潜在的密码String,使用map检查每个Char的后续Char,看看它是否应该被认为是序列的一部分。使用计数器变量来计算到目前为止找到的序列的当前大小,并在找到 non-sequence 时重置它。如果它超过允许的序列大小阈值,请立即拒绝密码。

我就是这样实现的。 我还检查是否没有向后的序列,例如 (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
}