
本文详解如何遍历含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。
以下是一个健壮、可读性强的实现方案:
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 < rows; i++) {
int colIndex = 0; // 当前行中记录第几个1(用于定位B[i][*])
for (int j = 0; j < cols; j++) {
if (matrixA[i][j] == 1) {
// 使用 formatted 安全构建坐标字符串(Java 15+),兼容旧版本可用 String.format
matrixB[i][colIndex++] = String.format("(%d, %d)", i, j);
// 若本行1的数量超过2个,此处会越界——因此题目隐含每行至多2个1,或需动态扩容
if (colIndex >= 2) break; // 防越界(符合示例中每行最多2列的设计)
}
}
}
return matrixB;
}关键说明与注意事项:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ✅ 坐标格式统一:采用 (行索引, 列索引) 的零基格式(Java数组惯例),清晰无歧义;
- ⚠️ 预分配策略:示例中 Matrix_B 定义为 6×2,表明题目预期按 行数×2 分配——即假设每行最多出现2个 1;若实际某行有3个及以上 1,则需改用 List<int[]> 或动态列表(如 ArrayList<String>)再转为二维数组,否则会丢失数据;
- ? 空值处理:未填充位置保持 null,符合示例输出,调用方需判空避免 NullPointerException;
- ? 扩展建议:生产环境推荐更灵活方案:
List<int[]> positions = new ArrayList<>(); for (int i = 0; i < matrixA.length; i++) for (int j = 0; j < matrixA[i].length; j++) if (matrixA[i][j] == 1) positions.add(new int[]{i, j}); // 转为二维数组(若必须返回数组): String[][] result = positions.stream() .map(p -> String.format("(%d, %d)", p[0], p[1])) .map(s -> new String[]{s}) .toArray(String[][]::new);
综上,该问题本质是带约束的稀疏矩阵坐标提取,核心在于理解题目对输出结构的隐含约定(如 m×2 固定宽度),并在遍历中精准控制写入位置。务必根据实际输入数据分布选择预分配策略,兼顾正确性与空间效率。
立即学习“Java免费学习笔记(深入)”;

















