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

Kotlin二维字符串数组使用indexOf出现类型推断错误

问题分析与解决方案

错误原因

你使用arrayOfSongs.indexOf(songVar)报错的核心原因是类型不匹配:

  • arrayOfSongs是Array<Array<String>>(二维数组),它的每个元素都是一个一维Array<String>(比如arrayOf("songTitle1", "3.46"))
  • indexOf方法会在数组中寻找与参数类型完全一致的元素,但你传入的songVar是String类型,和数组元素的Array<String>类型不匹配,因此编译报错。

解决方案

方案1:遍历二维数组匹配目标字符串

使用indexOfFirst遍历二维数组,找到歌曲名所在的行索引:

@Composable
fun TimeCalculation(
    songVar: String,
    arrayOfSongs: kotlin.Array<kotlin.Array<String>>
) {
    val time1 = if (songVar.isNotEmpty()) {
        // 找到第一个歌曲名匹配的行索引
        val index = arrayOfSongs.indexOfFirst { it[0] == songVar }
        // 如果找到索引,转换时间字符串为Double;否则返回0.0
        if (index != -1) arrayOfSongs[index][1].toDouble() else 0.0
    } else {
        0.0
    }
    // 后续使用time1的逻辑
}
  • indexOfFirst会遍历数组,返回第一个满足条件的元素索引,无匹配时返回-1
  • 注意确保每个一维数组至少有2个元素,避免ArrayIndexOutOfBoundsException

方案2:转换为Map实现高效查找(推荐)

如果你的歌曲列表不会频繁变动,建议将二维数组提前转换为Map<String, Double>,直接通过歌曲名映射时间,避免遍历数组:

// 初始化时转换为Map
val songTimeMap = rememberSaveable {
    arrayOfSongs.associate { songEntry ->
        songEntry[0] to songEntry[1].toDouble()
    }
}

// 在Composable中使用
@Composable
fun TimeCalculation(
    songVar: String,
    songTimeMap: Map<String, Double>
) {
    val time1 = if (songVar.isNotEmpty()) {
        // 从Map中取值,无匹配时返回默认值0.0
        songTimeMap[songVar] ?: 0.0
    } else {
        0.0
    }
    // 后续使用time1的逻辑
}

// 传入Composable时改为传Map
TimeCalculation(songVar, songTimeMap)

这种方式查找效率更高(O(1)复杂度),代码更简洁,也避免了索引操作的潜在风险。

内容的提问来源于stack exchange,提问作者The Quackiest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:21