密码生成器显示 kotlin.Unit

Password generator displays kotlin.Unit

我正在尝试根据用户输入制作随机密码生成器,一切正常,直到我使用 .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()
    }

shuffle returns Unit,因此在 Unit 上调用 toString() 将 return kotlin.Unit 定义在Unit。试试这个:

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

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


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
}