Java中将一维数组转为指定行数的二维数组,需先校验arr.length % rows == 0,再计算cols = arr.length / rows,最后通过i/cols和i%cols定位行列填充。

Java 中将一维数组转为指定行数的二维数组,核心是先确定每行元素个数(列数),再按顺序切分填充。关键前提是:一维数组长度必须能被指定行数整除,否则会丢失数据或抛异常——实际中建议先校验。
计算列数并校验合法性
给定行数 rows,列数 cols = arr.length / rows。必须满足 arr.length % rows == 0,否则无法均分。不满足时可选择截断、补零或抛出 IllegalArgumentException。
- 合法情况:arr.length=12,rows=3 → cols=4,可行
- 非法情况:arr.length=10,rows=3 → 10%3≠0,需处理
手动循环填充二维数组
创建 new int[rows][cols],用单层循环遍历原数组,通过 i / cols 算行索引、i % cols 算列索引:
int[] arr = {1, 2, 3, 4, 5, 6};
int rows = 2;
if (arr.length % rows != 0) {
throw new IllegalArgumentException("数组长度不能被行数整除");
}
int cols = arr.length / rows;
int[][] matrix = new int[rows][cols];
for (int i = 0; i < arr.length; i++) {
matrix[i / cols][i % cols] = arr[i];
}使用 Arrays.copyOfRange(适合小数组或需清晰逻辑)
对每行调用 Arrays.copyOfRange(arr, start, end) 截取子数组:
立即学习“Java免费学习笔记(深入)”;
- 第 r 行起始位置:r * cols
- 结束位置:(r + 1) * cols
- 注意:copyOfRange 的 end 是开区间,刚好匹配
代码示例:
int[][] matrix = new int[rows][cols];
for (int r = 0; r < rows; r++) {
int start = r * cols;
int end = start + cols;
matrix[r] = Arrays.copyOfRange(arr, start, end);
}封装成通用方法(支持任意类型)
用泛型方法适配 Object 或基本类型包装类(如 Integer):
public static <T> T[][] to2DArray(T[] arr, int rows) {
if (arr == null || rows <= 0 || arr.length % rows != 0) {
throw new IllegalArgumentException();
}
int cols = arr.length / rows;
@SuppressWarnings("unchecked")
T[][] matrix = (T[][]) new Object[rows][cols];
for (int i = 0; i < arr.length; i++) {
matrix[i / cols][i % cols] = arr[i];
}
return matrix;
}注:基本类型数组(如 int[])需单独写重载方法,因泛型不支持基本类型。


















