Scanner类从控制台读取用户输入来为数组赋值,依次获取每个元素的值存入
数组
通过Scanner类从控制台手动输入
这是最常用且直观的方法,适用于需要用户逐项指定数组元素的场景,具体流程如下:
- 导入包
必须引入java.util.Scanner工具类以启用输入功能。import java.util.Scanner;
- 创建Scanner实例
绑定标准输入流(键盘),代码为:Scanner scanner = new Scanner(System.in);
- 声明数组并确定长度
根据需求先定义数组的大小,比如创建一个长度为5的整型数组:int[] arr = new int[5];
- 循环读取每个元素的值
使用for循环配合nextInt()方法逐个获取用户的输入:for (int i = 0; i < arr.length; i++) { System.out.print("请输入第" + (i+1) + "个数字: "); arr[i] = scanner.nextInt(); // 等待用户键入回车确认 } - 关闭资源
完成后调用scanner.close()释放底层IO资源,避免内存泄漏。
️ 注意事项:若输入非整数会抛出异常(如输入字母),实际开发中建议添加异常处理逻辑,此方法要求提前知晓数组长度,灵活性较低。
动态初始化与扩展(进阶技巧)
当不确定最终需要的数组大小时,可采用以下策略:
方案1:先用ArrayList暂存数据再转数组
List<Integer> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("继续添加元素?(y/n):");
String choice = scanner.nextLine();
if (!choice.equalsIgnoreCase("y")) break;
list.add(scanner.nextInt());
}
Integer[] result = list.toArray(new Integer[0]); // 转换为普通数组
优势在于无需预设固定容量,适合不确定数据量的情况,但注意类型转换会带来一定性能开销。
方案2:利用Apache Commons Lang库的工具方法
第三方库提供了更便捷的API,
// Maven依赖:<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency> int[] array = ArrayUtils.toPrimitiveArray(ArrayUtils.toObject(Collections.singletonList(scanner.nextInt())));
不过这种方式复杂度较高,仅推荐特殊场景使用。
批量赋值与自动化填充
对于有规律的数据生成需求,可以尝试这些高效方案:
| 方法 | 示例代码 | 适用场景 |
|———————|———————————————–|——————————|
| Arrays.fill() | Arrays.fill(arr, 0); | 全部填充默认值 |
| Arrays.setAll() | Arrays.setAll(arr, i -> i2); | 基于索引计算元素值 |
| Stream API | IntStream.range(1,10).toArray(); | 快速生成序列或随机数 |
| 静态工厂模式 | new int[]{scanner.nextInt(), scanner.nextInt()}; | 少量元素的临时构造 |
Stream API特别适合需要数学规律初始化的场景,例如创建一个包含前N个自然数的平方组成的数组:
int n = 10;
int[] squares = IntStream.rangeClosed(1, n)
.map(x -> x x)
.toArray();
函数参数传递方式
如果希望复用代码逻辑,可以将数组作为参数传入方法进行处理,典型模式如下:
public static void populateArray(int[] targetArr) {
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < targetArr.length; i++) {
targetArr[i] = scanner.nextInt();
}
}
// 调用处:
int[] myData = new int[3];
populateArray(myData); // 直接修改原数组内容
这种方式实现了数据录入与业务逻辑的解耦,符合单一职责原则,需要注意的是,Java采用引用传递机制,方法内部对数组的修改会影响原始对象。
错误预防与调试建议
- 边界检查
确保循环条件不超过数组实际长度,防止ArrayIndexOutOfBoundsException,推荐使用增强型for循环减少出错概率:for (int element : arr) { / ... / } - 输入验证
对关键业务场景增加校验规则,如限制数值范围、过滤非规字符等:while (!scanner.hasNextInt()) { System.out.println("无效输入!请重新输入整数:"); scanner.next(); // 丢弃错误输入 } int validNum = scanner.nextInt(); - 日志辅助定位问题
在复杂系统中加入打印语句跟踪执行流程:System.out.printf("当前已读取%d个有效数据%n", count++);
FAQs
Q1: 如果用户中途取消输入怎么办?
A: 可以通过捕获NoSuchElementException来判断是否还有后续输入,例如在非阻塞模式下检测是否有可用数据:if (scanner.hasNextInt()) { ... },或者设置超时机制强制结束等待状态。
Q2: 能否直接让程序自动生成测试用的模拟数据?
A: 当然可以!除了前面提到的Stream API外,还可以使用Random类实现随机填充:
Random rnd = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = rnd.nextInt(100); // 生成0~99之间的随机整数
}
这种方法常用于单元测试
