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

如何正确合并同维度的二维Array<Array<Char>>数组?

二维字符数组合并问题

我有两个Array<Array<Char>>类型的二维字符数组,使用plus方法合并时得到的是行拼接结果,输出如下:

cells.plus(states.last().board.cells) —>

My output (cells here is my array of Array<Array<Char>>)
|     |
|  X  |
|     |
|X    |
|     |
|     |

请问如何正确合并它们?

示例如下:

val board3x3Array = arrayOf(
    arrayOf(' ', ' ', ' '),
    arrayOf(' ', 'X', ' '),
    arrayOf(' ', ' ', '0')
)

val board3x3Array2 = arrayOf(
    arrayOf('0', ' ', ' '),
    arrayOf(' ', ' ', ' '),
    arrayOf(' ', ' ', ' ')
)

合并后需要得到:

val merged = arrayOf(
    arrayOf('0', ' ', ' '),
    arrayOf(' ', 'X', ' '),
    arrayOf(' ', ' ', '0')
)

问题原因

Kotlin中Array.plus方法的作用是将第二个数组的所有元素追加到当前数组末尾。对于二维数组来说,就是把第二个数组的每一行作为新行添加到第一个数组后面,所以你得到了6行的拼接结果,而非对应位置的元素合并。

解决方案

要实现对应位置的元素合并,需要遍历两个数组的每个位置,根据自定义规则(示例中是优先保留非空格字符,第二数组的非空格覆盖第一数组)构建新数组:

fun mergeBoards(board1: Array<Array<Char>>, board2: Array<Array<Char>>): Array<Array<Char>> {
    // 先校验两个数组的行列数一致
    require(board1.size == board2.size && board1.isNotEmpty() && board1[0].size == board2[0].size) {
        "两个二维数组的行列数必须完全一致"
    }

    return board1.mapIndexed { rowIdx, row ->
        row.mapIndexed { colIdx, char ->
            // 规则:如果board2对应位置不是空格,就用board2的元素,否则用board1的
            if (board2[rowIdx][colIdx] != ' ') board2[rowIdx][colIdx] else char
        }.toTypedArray()
    }.toTypedArray()
}

测试示例

调用上述方法处理示例中的数组:

val board3x3Array = arrayOf(
    arrayOf(' ', ' ', ' '),
    arrayOf(' ', 'X', ' '),
    arrayOf(' ', ' ', '0')
)

val board3x3Array2 = arrayOf(
    arrayOf('0', ' ', ' '),
    arrayOf(' ', ' ', ' '),
    arrayOf(' ', ' ', ' ')
)

val merged = mergeBoards(board3x3Array, board3x3Array2)
// merged的结果就是你期望的数组

如果需要调整合并规则(比如优先保留board1的元素,或取任意非空值),只需要修改mapIndexed中的判断逻辑即可。

内容的提问来源于stack exchange,提问作者Денис Попков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:40:39