为什么这段Kotlin代码无法正常运行?(判断字符是否在列表中并打印)
Kotlin代码排查:字符匹配遍历问题
问题描述
这段代码意图遍历字符串中的每个字符,若字符存在于指定列表中则打印该字符,但无法正常运行。预期正确输出为:
J B K C
原代码
import kotlin.reflect fun main(args: Array<String>) { val cons = listOf("B","C","D", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z",) var str = "JBIKCA" for (item in str.indices) { val j = (str[item]) if (j in cons){ println(j) } } }
问题原因
核心问题是类型不匹配:
cons是List<String>类型,存储的是字符串形式的单个字符(比如"B")str[item]从字符串中取出的是Char类型(比如'B')
两者属于不同的数据类型,因此j in cons的判断永远为false,不会执行打印逻辑。
修复方案
有两种可行的修复方式:
方式1:统一使用Char类型集合
将cons改为存储Char类型的集合,直接和字符串取出的字符匹配:
fun main(args: Array<String>) { // 改用Char类型的集合 val cons = listOf('B','C','D', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z') val str = "JBIKCA" // 直接遍历字符串的字符,比操作indices更简洁 for (char in str) { if (char in cons) { println(char) } } }
方式2:将Char转为String再匹配
如果需要保留cons为List<String>,则把取出的Char转换为String后再判断:
fun main(args: Array<String>) { val cons = listOf("B","C","D", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z") val str = "JBIKCA" for (item in str.indices) { // 将Char转为String val j = str[item].toString() if (j in cons){ println(j) } } }
额外优化建议
如果cons是固定不变的集合,建议使用setOf代替listOf,因为Set的contains操作时间复杂度为O(1),比List的O(n)效率更高:
val cons = setOf('B','C','D', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z')
内容的提问来源于stack exchange,提问作者Les Chymero
相关产品推荐
相关产品推荐

