
本文详解如何遍历含0/1的二维数组,提取值为1的元素行列索引,并按行优先顺序紧凑存入大小可变的目标矩阵(如string[][]),避免空位浪费,兼顾内存效率与逻辑清晰性。
本文详解如何遍历含0/1的二维数组,提取值为1的元素行列索引,并按行优先顺序紧凑存入大小可变的目标矩阵(如string[][]),避免空位浪费,兼顾内存效率与逻辑清晰性。
在实际编程题(如OOP考试)中,常遇到“坐标压缩存储”类问题:给定一个 m×n 的二值矩阵 A(仅含0和1),要求将所有值为 1 的元素的行列坐标(如 (i, j))提取出来,并按原始行序优先、列序次之的顺序,依次存入一个结构更紧凑的结果矩阵 B。注意:B 并非固定 m×n,而是应尽可能节省空间——常见设计是 B 为 k×2 矩阵(k 为1的总数),每行存一个坐标对;但若题目限制 B 预分配为 m×2(如示例所示),则需在每行内从左到右填入本行出现的1的坐标,未填位置保留 null。
以下是一个健壮、可读性强的实现方案:
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
public static String[][] extractOnePositions(int[][] matrixA) {
if (matrixA == null || matrixA.length == 0)
return new String[0][2];
int rows = matrixA.length;
int cols = matrixA[0].length;
// 预分配 B 为 rows × 2:每行最多存本行所有1的坐标(最多cols个,但通常远少于cols)
// 此处按题目隐含要求使用 rows × 2 结构(兼容示例输出格式)
String[][] matrixB = new String[rows][2];
for (int i = 0; i = 2) break; // 防越界(符合示例中每行最多2列的设计)
}
}
}
return matrixB;
}
关键说明与注意事项:
- ✅ 坐标格式统一:采用 (行索引, 列索引) 的零基格式(Java数组惯例),清晰无歧义;
- ⚠️ 预分配策略:示例中 Matrix_B 定义为 6×2,表明题目预期按 行数×2 分配——即假设每行最多出现2个 1;若实际某行有3个及以上 1,则需改用 List
或动态列表(如 ArrayList )再转为二维数组,否则会丢失数据; - ? 空值处理:未填充位置保持 null,符合示例输出,调用方需判空避免 NullPointerException;
- ? 扩展建议:生产环境推荐更灵活方案:
List<int> positions = new ArrayList(); for (int i = 0; i String.format("(%d, %d)", p[0], p[1])) .map(s -> new String[]{s}) .toArray(String[][]::new);</int>
综上,该问题本质是带约束的稀疏矩阵坐标提取,核心在于理解题目对输出结构的隐含约定(如 m×2 固定宽度),并在遍历中精准控制写入位置。务必根据实际输入数据分布选择预分配策略,兼顾正确性与空间效率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










