Java数组转换:一维数组转二维数组实例解析
一、题目代码分析
以下是需要补全的Java代码,核心功能是将长度为15的一维数组,转换为5行3列的二维数组,并通过控制台输入为一维数组赋值,最终打印二维数组内容:
import java.util.*;
public class Java_1{
public static void main(String[] args){
int[] a = new int[15]; // 长度15的一维数组
int i, j, k;
int[][] b = new int[5][]; // 5行的二维数组(列数未指定)
for (i = 0; i < b.length; i++)
//**********Found**********
b[i] = new int[_________];
//**********Found**********
Scanner scan = new Scanner(_________);
for (i = 0; i < a.length; i++)
//**********Found**********
a[i] = scan._________();
k = 0; // 一维数组的索引计数器
for (i = 0; i < b.length; i++) {
//**********Found**********
for (j = 0; j <_________.length; j++) {
//**********Found**********
b[i][j] = a[_________];
System.out.print(String.format("%5d",b[i][j])); // 格式化打印
}
System.out.println(); // 换行
}
}
}
二、空白处逐一解析
要完成“一维数组转二维数组”的逻辑,需结合数组长度匹配、输入流使用、索引关联三个核心点,逐个突破空白:
1. 第一个空白:b[i] = new int[_________];
- 解析:二维数组
b
已定义为5行(new int[5][]
),需为每行分配列数。
已知一维数组a
长度为15,要均匀分配到5行中,每行列数 = 15 ÷ 5 = 3。 - 答案:
3
2. 第二个空白:Scanner scan = new Scanner(_________);
- 解析:
Scanner
是Java的输入工具,需指定输入源。此处需从控制台(键盘)输入,对应输入源为System.in
(标准输入流)。 - 答案:
System.in
3. 第三个空白:a[i] = scan._________();
- 解析:一维数组
a
是int
类型,需读取控制台输入的整数。Scanner
中读取整数的方法是nextInt()
。 - 答案:
nextInt
4. 第四个空白:for (j = 0; j <_________.length; j++)
- 解析:内层循环遍历二维数组
b
的“列”,需获取当前行(b[i]
)的列数(即当前行一维数组的长度)。 - 答案:
b[i]
5. 第五个空白:b[i][j] = a[_________];
- 解析:需将一维数组
a
的元素按顺序赋值给二维数组b
。
定义k=0
为一维数组的索引计数器,每赋值一个元素,k
自增1(k++
),确保索引连续不重复。 - 答案:
k++
三、完整正确代码
import java.util.*;
public class Java_1{
public static void main(String[] args){
int[] a = new int[15]; // 长度15的一维数组
int i, j, k;
int[][] b = new int[5][]; // 5行的二维数组(先指定行数,后分配列数)
for (i = 0; i < b.length; i++)
b[i] = new int[3]; // 每行3列,5×3=15,与一维数组长度匹配
Scanner scan = new Scanner(System.in); // 控制台输入流
System.out.println("请输入15个整数(空格或回车分隔):");
for (i = 0; i < a.length; i++)
a[i] = scan.nextInt(); // 读取整数赋值给一维数组
k = 0; // 一维数组索引计数器
System.out.println("\n转换后的5行3列二维数组:");
for (i = 0; i < b.length; i++) { // 遍历二维数组的行
for (j = 0; j < b[i].length; j++) { // 遍历当前行的列
b[i][j] = a[k++]; // 一维数组元素按顺序赋值给二维数组
System.out.print(String.format("%5d",b[i][j])); // 占5位格式化打印,对齐美观
}
System.out.println(); // 每行结束后换行
}
scan.close(); // 关闭输入流,避免资源泄漏
}
}
四、代码运行示例
1. 输入
控制台提示输入15个整数(示例输入): 请输入15个整数(空格或回车分隔):1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2. 输出
转换后的5行3列二维数组:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
五、核心知识点总结
通过这个实例,我们可以掌握Java数组操作的3个核心知识点:
1. 不规则二维数组的初始化
Java的二维数组本质是“数组的数组”,支持不规则初始化(每行列数可不同):
- 第一步:先指定行数:
int[][] b = new int[5][];
(仅创建5个一维数组的引用,未分配内存) - 第二步:为每行分配列数:
b[i] = new int[3];
(为第i
行分配3个int的内存空间)
本题中为“规则二维数组”(每行列数相同),若要创建不规则数组(如第1行2列、第2行3列),只需在循环中为不同行分配不同列数即可。
2. Scanner控制台输入的正确用法
- 创建输入流:
Scanner scan = new Scanner(System.in);
(System.in
是控制台输入源) 读取数据:
- 整数:
scan.nextInt()
- 字符串:
scan.next()
(读取到空格/回车为止)或scan.nextLine()
(读取整行)
- 整数:
- 关闭流:
scan.close()
(避免资源泄漏,养成用完关闭的习惯)
3. 一维数组与二维数组的索引关联
将一维数组a
(长度n
)转换为m
行k
列的二维数组b
,需满足n = m × k
(长度匹配),索引关联逻辑:
- 定义计数器
k=0
(对应一维数组的索引) - 二维数组的
b[i][j]
(第i
行第j
列)对应一维数组的a[k]
- 每赋值一次,
k
自增1(k++
),确保所有元素按顺序传递
本质是将“一维线性存储”转换为“二维行列存储”,核心是索引的线性映射。
六、拓展与优化建议
本题的基础功能可进一步优化,提升代码的健壮性和灵活性:
1. 输入验证(避免非整数输入报错)
若用户输入非整数,scan.nextInt()
会抛出InputMismatchException
,可添加异常处理:
for (i = 0; i < a.length; i++) {
System.out.print("请输入第" + (i+1) + "个整数:");
while (!scan.hasNextInt()) { // 判断是否为整数
System.out.print("输入错误!请重新输入整数:");
scan.next(); // 丢弃非整数输入
}
a[i] = scan.nextInt();
}
2. 动态指定二维数组行列数
当前代码是固定的“5行3列”,可改为让用户输入行列数(需确保行数×列数=15
):
System.out.print("请输入二维数组的行数(需满足:行数×列数=15):");
int rows = scan.nextInt();
int cols = 15 / rows; // 自动计算列数
int[][] b = new int[rows][cols]; // 直接初始化规则二维数组
3. 通用化数组转换方法
将“一维转二维”的逻辑封装为方法,提高代码复用性:
// 通用方法:将一维数组转为rows行cols列的二维数组(需满足a.length = rows×cols)
public static int[][] convert1DTo2D(int[] a, int rows, int cols) {
int[][] result = new int[rows][cols];
int k = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
result[i][j] = a[k++];
}
}
return result;
}
通过本题的学习,不仅能掌握数组转换的具体实现,更能理解Java数组的存储本质和索引逻辑——这些基础能力在后续处理矩阵运算、数据批量存储等场景中都会频繁用到。