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
相关产品推荐
相关产品推荐

