Kotlin中如何使用布尔索引表示2×2二维Int数组
在Kotlin中实现布尔索引的二维Int结构
嘿,这个需求其实很好解决!Kotlin里的普通数组确实不支持直接用布尔值当索引,但我们可以通过几种方式模拟出你想要的「布尔键二维结构」,下面给你几个实用的方案:
方案1:嵌套Map(最直观的实现)
这个方式完全贴合你想要的结构,直接用Boolean作为Map的键,嵌套两层Map就可以实现:
// 初始化符合你需求的结构 val booleanIndexedMap = mapOf( true to mapOf( true to 0, false to 75 ), false to mapOf( true to 1, false to 34 ) ) // 访问示例 val trueFalseValue = booleanIndexedMap[true]?.get(false) // 结果是75 val falseTrueValue = booleanIndexedMap[false]?.get(true) // 结果是1
优点:和你描述的结构完全对应,可读性拉满,不需要额外转换逻辑;
缺点:相比数组性能略低,但对于2×2的规模来说完全可以忽略。
方案2:封装普通二维数组(高性能选择)
如果想要保留数组的高性能,我们可以利用布尔值和整数索引的映射关系,封装一个普通二维数组,再通过扩展函数实现布尔索引的访问:
// 先按「true行、false行」「true列、false列」的顺序初始化普通二维数组 val intArray = arrayOf( intArrayOf(0, 75), // true行:[true列值, false列值] intArrayOf(1, 34) // false行:[true列值, false列值] ) // 扩展函数:用布尔值获取对应位置的元素 fun Array<IntArray>.getByBoolean(row: Boolean, col: Boolean): Int { // 把布尔值映射为数组索引:true→0,false→1(你也可以根据需求调整映射规则) val rowIndex = if (row) 0 else 1 val colIndex = if (col) 0 else 1 return this[rowIndex][colIndex] } // 扩展函数:用布尔值设置对应位置的元素 fun Array<IntArray>.setByBoolean(row: Boolean, col: Boolean, value: Int) { val rowIndex = if (row) 0 else 1 val colIndex = if (col) 0 else 1 this[rowIndex][colIndex] = value } // 使用示例 val value = intArray.getByBoolean(true, false) // 75 intArray.setByBoolean(false, false, 99) // 将false行false列的值改为99
优点:保留了数组的高性能,封装后使用体验和布尔索引一致;
缺点:需要额外写映射逻辑,但逻辑非常简单。
方案3:自定义枚举(语义化增强)
如果希望代码的语义更清晰(比如避免布尔值的歧义),可以用枚举来替代布尔值作为索引:
enum class RowFlag { TRUE_ROW, FALSE_ROW } enum class ColFlag { TRUE_COL, FALSE_COL } val enumIndexedMap = mapOf( RowFlag.TRUE_ROW to mapOf( ColFlag.TRUE_COL to 0, ColFlag.FALSE_COL to 75 ), RowFlag.FALSE_ROW to mapOf( ColFlag.TRUE_COL to 1, ColFlag.FALSE_COL to 34 ) ) // 访问示例 val value = enumIndexedMap[RowFlag.TRUE_ROW]?.get(ColFlag.FALSE_COL) // 75
这个方案适合更复杂的业务场景,不过对于你的2×2布尔索引需求来说,前两个方案会更简洁。
内容的提问来源于stack exchange,提问作者Jofbr
相关产品推荐
相关产品推荐

