Java从控制台输入数组:Scanner实用指南与多类型处理333


在Java编程中,我们经常需要处理来自用户的输入。数组作为一种基本且常用的数据结构,其元素的获取方式尤其重要。本文将深入探讨如何在Java中从控制台(键盘)“直接输入”数组,这通常意味着程序在运行时动态地接收用户输入的数组元素。我们将重点介绍 `Scanner` 类的使用,涵盖固定长度数组、不同数据类型数组、单行多元素输入以及动态长度数组的处理方法,并讨论输入校验和最佳实践。


一、Java输入数组的核心工具:Scanner类


`Scanner` 类是Java中用于扫描输入文本的实用工具,它可以解析基本类型(如`int`、`long`、`double`)和字符串。它是从控制台获取用户输入最常用和最方便的方法。


要使用`Scanner`,你需要:

导入``包。
创建一个`Scanner`对象,通常将其与``关联,表示从标准输入流读取。
使用`Scanner`对象提供的方法读取不同类型的数据。
在完成输入后,关闭`Scanner`对象以释放系统资源。


基本用法示例:

import ;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(); // 创建Scanner对象
("请输入一个整数: ");
int num = (); // 读取整数
("你输入的整数是: " + num);
// 注意:nextInt()不会读取行尾的换行符,可能影响后续nextLine()的读取
// 通常在nextInt()后加一个()来“消费”掉这个换行符
();
("请输入一行文本: ");
String text = (); // 读取一行文本
("你输入的文本是: " + text);
(); // 关闭Scanner
}
}


二、固定长度数组的输入


这是最常见的情况:用户首先指定数组的长度,然后逐个输入数组的元素。


1. 整数数组 (int[])



假设我们需要创建一个整数数组,并让用户输入其长度及所有元素。



import ;
public class FixedLengthIntArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
("请输入数组的长度: ");
int length = (); // 读取数组长度
int[] numbers = new int[length]; // 根据长度创建数组
("请逐个输入 " + length + " 个整数:");
for (int i = 0; i < length; i++) {
("请输入第 " + (i + 1) + " 个整数: ");
numbers[i] = (); // 逐个读取整数并存入数组
}
("你输入的数组是: [");
for (int i = 0; i < ; i++) {
(numbers[i]);
if (i < - 1) {
(", ");
}
}
("]");
();
}
}


2. 字符串数组 (String[])



对于字符串数组,我们需要使用 `()` 来读取每一行文本。



import ;
public class FixedLengthStringArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
("请输入字符串数组的长度: ");
int length = ();
(); // 消费掉nextInt()留下的换行符,非常重要!
String[] texts = new String[length];
("请逐个输入 " + length + " 个字符串:");
for (int i = 0; i < length; i++) {
("请输入第 " + (i + 1) + " 个字符串: ");
texts[i] = (); // 读取整行字符串
}
("你输入的字符串数组是: [");
for (int i = 0; i < ; i++) {
("" + texts[i] + "");
if (i < - 1) {
(", ");
}
}
("]");
();
}
}


3. 浮点数数组 (double[])



类似地,对于浮点数,我们可以使用 `()`。



import ;
public class FixedLengthDoubleArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
("请输入双精度浮点数数组的长度: ");
int length = ();
// (); // 如果后面没有nextLine(),这里可以省略
double[] values = new double[length];
("请逐个输入 " + length + " 个双精度浮点数:");
for (int i = 0; i < length; i++) {
("请输入第 " + (i + 1) + " 个浮点数: ");
values[i] = (); // 读取双精度浮点数
}
("你输入的浮点数数组是: [");
for (int i = 0; i < ; i++) {
(values[i]);
if (i < - 1) {
(", ");
}
}
("]");
();
}
}


三、单行多元素输入(例如:用空格分隔)


有时,用户可能希望在一行中输入所有数组元素,并用空格或其他分隔符隔开。这种情况下,我们可以先读取整行字符串,然后使用 `()` 方法进行分割。



import ;
public class SingleLineMultiElementInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
("请输入一组整数,用空格分隔 (例如: 1 2 3 4 5): ");
String line = (); // 读取整行输入
String[] strNumbers = (" "); // 使用空格分割字符串
int[] numbers = new int[]; // 创建相应大小的整数数组
for (int i = 0; i < ; i++) {
try {
numbers[i] = (strNumbers[i]); // 将字符串转换为整数
} catch (NumberFormatException e) {
("错误: '" + strNumbers[i] + "' 不是一个有效的整数,已跳过或设为默认值。");
numbers[i] = 0; // 错误处理:赋默认值或抛出异常
}
}
("你输入的数组是: [");
for (int i = 0; i < ; i++) {
(numbers[i]);
if (i < - 1) {
(", ");
}
}
("]");
();
}
}


四、动态长度数组的输入 (利用ArrayList)


如果数组的长度在程序设计时或用户输入时都无法确定,需要根据用户持续输入直到某种结束标志(例如输入非数字字符,或者输入特定关键字如"done"),这种情况下,通常先使用 `ArrayList` 来收集元素,然后再将其转换为固定大小的数组。



import ;
import ;
import ;
public class DynamicArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
List<Integer> tempNumbers = new ArrayList<>(); // 使用ArrayList临时存储
("请逐个输入整数,输入非整数字符 (如 'q') 结束:");
while (()) { // 判断下一个输入是否是整数
int num = ();
(num);
("已添加 " + num + ". 继续输入或输入非整数结束: ");
}
// 将ArrayList转换为int[]数组
int[] numbers = new int[()];
for (int i = 0; i < (); i++) {
numbers[i] = (i);
}
("你最终输入的数组是: [");
for (int i = 0; i < ; i++) {
(numbers[i]);
if (i < - 1) {
(", ");
}
}
("]");
();
}
}


注意: 对于 `ArrayList` 转换为 `int[]`,也可以使用Java 8的Stream API:

// int[] numbers = ().mapToInt(Integer::intValue).toArray();

但为了兼容性和理解性,手动循环转换也是很常见的做法。


五、输入校验与异常处理


用户输入是不可预测的,可能会输入不符合预期格式的数据。例如,当程序期望一个整数时,用户输入了文本。这会导致 `InputMismatchException`。为了使程序更加健壮,我们需要进行输入校验和异常处理。



import ;
import ;
public class RobustArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner();
int length = 0;
boolean validInput = false;
// 循环直到获得有效的数组长度
while (!validInput) {
("请输入数组的长度 (一个正整数): ");
try {
length = ();
if (length

2025-11-03


上一篇:Java日常编程:掌握核心技术与最佳实践,构建高效健壮应用

下一篇:Java `byte` 数组深度解析:核心方法、转换技巧与高级应用