如何正确合并同维度的二维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,提问作者Денис Попков
相关产品推荐
相关产品推荐

