Kotlin:如何用Lambda或扩展函数替代双循环实现单字母密码加密?
优化单字母密码加密:用Kotlin高阶函数替代双层循环
嘿,这个需求太常见啦!你当前的双层循环确实能实现功能,但用Kotlin的函数式特性可以让代码更简洁、性能也更好。核心思路是先把字母映射关系转换成Map,然后借助高阶函数快速完成字符替换,完全不需要嵌套循环~
优化后的代码实现
fun encrypt(message: String) { val alphabets = ('A'..'Z').toList() val shuffAlp = alphabets.shuffled() // 将字母对直接转换为Map,实现O(1)时间复杂度的查找 val encryptionMap = alphabets.zip(shuffAlp).toMap() // 用map高阶函数遍历消息字符,直接查找映射,最后拼接成字符串 val encryptedMessage = message.map { encryptionMap[it] ?: it }.joinToString("") println(encryptedMessage) // 对应你假设的shuffle结果,依然输出DLNJ }
为什么这样更优?
- 性能提升:原来的双层循环是O(n²)的时间复杂度(n是消息长度+字母表长度),换成Map后查找是O(1),整体复杂度降到O(n),消息越长优势越明显
- 代码可读性:用
map和joinToString替代嵌套循环,逻辑一目了然,别人看代码能快速理解“把每个字符换成映射后的字符,再拼起来” - 灵活性:如果后续需要支持小写字母、数字甚至符号,只需要扩展
alphabets的范围,Map的映射逻辑完全不用改
额外扩展:支持大小写的版本(可选)
如果你的消息可能包含小写字母,可以轻松扩展代码:
fun encryptWithCase(message: String) { val alphabets = ('A'..'Z') + ('a'..'z') val shuffAlp = alphabets.shuffled() val encryptionMap = alphabets.zip(shuffAlp).toMap() val encryptedMessage = message.map { encryptionMap[it] ?: it }.joinToString("") println(encryptedMessage) }
内容的提问来源于stack exchange,提问作者Silver Sky
相关产品推荐
相关产品推荐

