如何根据给定行列数据生成空值填充为0的矩阵
行列分组数据补全重建矩阵方案
问题所属场景
这类需求常见于带合并单元格的表格解析流程(比如Excel、HTML表格的合并单元格拆分后数据还原),属于结构化表格数据重建的子问题,开发场景中一般称其为合并单元格拆分后的空值补全,没有专门的学术专有名称。
核心实现思路
你之前的代码出现索引越界,核心原因有两个:
- 初始化矩阵时行列维度写反:目标矩阵是4行2列,原代码生成的是2行4列
- 手动维护x/y双游标遍历的逻辑过于复杂,边界判断极易出错
最简洁的实现逻辑不需要复杂的游标跳转:
- 最终矩阵的行数等于
rows数组长度,列数等于columns数组长度,先将矩阵所有位置初始化为0 - 预处理列分组数据,建立「值 -> 所属列索引」的映射表,避免重复查找
- 逐行遍历行分组数据,对每个非空值,通过映射表找到它对应的列位置,直接填充到矩阵对应坐标即可
代码实现
Python 版本
def build_complete_matrix(rows_group, cols_group): # 初始化全0矩阵 matrix = [["0" for _ in range(len(cols_group))] for _ in range(len(rows_group))] # 构建值到列索引的映射 col_index = {} for c_idx, col_vals in enumerate(cols_group): for val in col_vals: col_index[val] = c_idx # 逐行填充非空值 for r_idx, row_vals in enumerate(rows_group): for val in row_vals: matrix[r_idx][col_index[val]] = val return matrix # 测试用例 if __name__ == "__main__": rows = [ ["A", "E"], ["B"], ["C", "G"], ["H"] ] cols = [ ["A", "B", "C"], ["E", "G", "H"] ] result = build_complete_matrix(rows, cols) for line in result: print(line)
运行输出完全符合预期:
['A', 'E'] ['B', '0'] ['C', 'G'] ['0', 'H']
修正后的 Dart 版本
void main() { produceTable(); } void produceTable() { final columns = [ ["A", "B", "C"], ["E", "G", "H"] ]; final rows = [ ["A", "E"], ["B"], ["C", "G"], ["H"] ]; // 正确初始化4行2列的全0矩阵 final table = List.generate( rows.length, (_) => List.generate(columns.length, (_) => "0") ); // 预处理值到列索引的映射 final Map<String, int> colIndexMap = {}; for (int colIdx = 0; colIdx < columns.length; colIdx++) { for (String val in columns[colIdx]) { colIndexMap[val] = colIdx; } } // 逐行填充非空值 for (int rowIdx = 0; rowIdx < rows.length; rowIdx++) { for (String val in rows[rowIdx]) { final int? targetCol = colIndexMap[val]; if (targetCol != null) { table[rowIdx][targetCol] = val; } } } // 打印结果 for (final row in table) { print(row); } }
复杂度说明
该实现时间复杂度为O(M+N)(M为所有单元格总数量,N为列分组值总数量),比多层循环比对的逻辑效率高很多,也不存在游标越界的风险。
内容的提问来源于stack exchange,提问作者TopologyG
相关产品推荐
相关产品推荐

