You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:20:30