【问题标题】:Password generator displays kotlin.Unit密码生成器显示 kotlin.Unit
【发布时间】:2021-01-19 11:02:35
【问题描述】:

我正在尝试根据用户输入制作随机密码生成器,在我使用 .toCharArray().shuffle() 函数之前一切都很好,但是如果不改组它太可预测了,因为它会输入字母在预定的位置。这段代码有什么方法可以工作吗?任何解决方法?我已经尝试过 stringbuilder 但它绕过了用户输入,所以我现在不知道该怎么做。

val chars= "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~@#$%^&*()!"

 override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        if (fromUser)
        {
            when(seekBar)
            {
                sbNumberOfLetters ->
                {
                    tvLetterCount.text = progress.toString()
                    smallLetters = progress
                }

                sbNumberOfCapitalLetters ->
                {
                    tvCapitalsCount.text = progress.toString()
                    capitalLetterNumber = progress
                }

                sbNumberOfNumerals ->
                {
                    tvNumeralsCount.text = progress.toString()
                    numeralsNumber = progress
                }

                sbNumberOfSpecialChars ->
                {
                    tvSpecialCharsCount.text = progress.toString()
                    specialCharNumber = progress
                }
            }
        }
    }



 private fun generatePassword() {

        for (y in 1..numeralsNumber)
        {
            var randomLetter = Random.nextInt(0, 9)
            listOfLetters.add(chars[randomLetter].toString())
        }

        for (w in 1..smallLetters)
        {
            var randomLetter = Random.nextInt(10, 36)
            listOfLetters.add(chars[randomLetter].toString())
        }

        for (x in 1..capitalLetterNumber)
        {
            var randomLetter = Random.nextInt(36, 62)
            listOfLetters.add(chars[randomLetter].toString())
        }

        for (z in 1..specialCharNumber)
        {
            var randomLetter = Random.nextInt(63, 73)
            listOfLetters.add(chars[randomLetter].toString())
        }

        password = (listOfLetters.joinToString(separator = "",)).toCharArray().shuffle().toString()

        tvGeneratedPassword.text = password

        listOfLetters.clear()
    }

【问题讨论】:

    标签: android string kotlin random passwords


    【解决方案1】:

    shuffle 返回Unit,因此在Unit 上调用toString() 将返回在Unit 中定义的kotlin.Unit。试试这个:

    listOfLetters.shuffle()
    val password = listOfLetters.joinToString(separator = "")
    tvGeneratedPassword.text = password
    

    【讨论】:

    • 从好的方面来说,这个解决方案不会返回 kotlin.Unit。缺点是它似乎完全忽略了用户输入。即使所有变量都变为零,它仍然会返回一些不需要的 10 字母字符串。总是以 [C@ 开头
    • @Piotr 我以为你想要那个。更新了对列表进行洗牌然后转换为字符串的答案。您不必致电toCharArray()
    • 好的,现在我知道了,只需要使用一些 println 来检查到底发生了什么。谢谢你,先生。
    【解决方案2】:

    不妨使用 Kotlin 提供的工具来编写富有表现力和可维护的代码(您提供的代码中 Random.nextInt 的索引是 correct 吗?)。这是另一种选择(这里使用列表而不是数组,shuffled() 返回一个新列表):

    
    abstract sealed class RandomChars {
        open val chars: CharArray = charArrayOf()
        fun get(count: Int) = (1..count).map { chars[Random.nextInt(0, chars.size)] }
    }
    object RandomDigits : RandomChars() {
        override val chars = "0123456789".toCharArray()
    }
    object RandomLowerCase : RandomChars() {
        override val chars = "abcdefghijklmnopqrstuvwxyz".toCharArray()
    }
    object RandomUpperCase : RandomChars() {
        override val chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()
    }
    object RandomSpecial : RandomChars() {
        override val chars = "~@#$%^&*()!".toCharArray()
    }
    
    fun main() {
        val password =
            (RandomDigits.get(1) + RandomLowerCase.get(2) + RandomUpperCase.get(2) + RandomSpecial.get(1))
                .shuffled()
                .joinToString(separator = "")
    
        println(password) // e.g. %Oa7Mt
    }
    
    

    这是另一种更实用的方法:

    
    val charGenerator =
        { alphabet: CharArray -> { count: Int -> (1..count).map { alphabet[Random.nextInt(0, alphabet.size)] } } }
    
    val randomDigits = charGenerator("0123456789".toCharArray())
    val randomLowecase = charGenerator("abcdefghijklmnopqrstuvwxyz".toCharArray())
    val randomUppercase = charGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray())
    val randomSpecial = charGenerator("~@#$%^&*()!".toCharArray())
    
    fun main() {
        val password =
            (randomDigits(1) + randomLowecase(2) + randomUppercase(2) + randomSpecial(1))
                .shuffled()
                .joinToString(separator = "")
    
        println(password) // e.g. %Oa7Mt
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2010-12-02
      • 2016-08-18
      • 2012-03-17
      相关资源
      最近更新 更多