
本文旨在解释在Java程序中,当方法需要接收多个输入时,如何通过`Scanner`类实现数据的读取和传递。我们将通过一个简单的成绩计算示例,深入理解`Scanner`的工作原理,以及如何在方法中有效地处理用户的输入。
在Java编程中,从控制台获取用户输入是常见的需求。java.util.Scanner 类提供了一种便捷的方式来实现这一功能。本文将通过一个成绩计算的例子,详细讲解如何使用 Scanner 类在方法中接收多个输入,并深入理解其工作原理。
Scanner 类用于读取来自各种输入源的数据,包括键盘输入(System.in)、文件等。它将输入分解为 tokens (默认情况下使用空格分隔),并提供各种方法来读取不同类型的数据,例如 nextInt()、nextDouble()、nextLine() 等。
在示例代码中,Scanner sc = new Scanner(System.in); 创建了一个 Scanner 对象,它从标准输入流 System.in 读取数据,也就是从键盘读取用户的输入。
立即学习“Java免费学习笔记(深入)”;
让我们回顾一下提供的示例代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double avg;
String[] name = new String[10]; //craeting a string array named "name" that has 10
for (int j = 0; j<10; j++)
{
System.out.println("What is the name of the student?");
name[j] = sc.nextLine(); // nextLine because we want the string of the input
System.out.println("What are their test scores?");
avg = calculateAverage(j);
System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
}
}
public static double calculateAverage(int j) {
double [][]gradebook = new double[10][5];
Scanner sc = new Scanner(System.in);
double sum = 0;
for (int v=0; v<5; v++)
{
gradebook[j][v] = sc.nextDouble();
sum = gradebook[j][v] + sum;
}
double avg = sum / 5;
return avg;
}
public static String calculateGrade (double avg)
{
if (avg >= 90 && avg <= 100) {
return "A";
}
else if (avg >= 80) {
return "B";
}
else if (avg >= 70) {
return "C";
}
else if (avg >= 60) {
return "D";
}
else {
return "F";
}
}
}关键在于 calculateAverage 方法中的这段代码:
public static double calculateAverage(int j) {
double [][]gradebook = new double[10][5];
Scanner sc = new Scanner(System.in);
double sum = 0;
for (int v=0; v<5; v++)
{
gradebook[j][v] = sc.nextDouble();
sum = gradebook[j][v] + sum;
}
double avg = sum / 5;
return avg;
}在 calculateAverage 方法内部,也创建了一个 Scanner 对象。当执行到 gradebook[j][v] = sc.nextDouble(); 这行代码时,程序会暂停,等待用户输入一个 double 类型的数值。用户输入后,该数值会被赋值给 gradebook[j][v],然后循环继续,直到读取了 5 个数值。
重要: 每次调用 sc.nextDouble(),程序都会等待用户输入。这就是为什么用户可以输入多个数字,并且这些输入会被逐步地赋值给 gradebook[j][v]。
虽然在 main 方法中也创建了一个 Scanner 对象,但 calculateAverage 方法中也创建了自己的 Scanner 对象,并且在这个方法中,程序会直接调用 sc.nextDouble() 来读取输入。因此,用户输入的数值会被直接传递给 calculateAverage 方法中的 gradebook 数组。
可以将 Scanner 理解为一个输入流的管道。当 calculateAverage 方法中的 Scanner 对象调用 nextDouble() 方法时,它会尝试从这个管道中读取数据。如果管道中没有数据,程序就会阻塞,等待用户输入。
虽然上述代码可以工作,但存在一些可以改进的地方:
避免在循环中重复创建 Scanner 对象: 在 calculateAverage 方法中,每次调用该方法都会创建一个新的 Scanner 对象。这会降低程序的效率。可以将 Scanner 对象作为参数传递给 calculateAverage 方法,或者在 main 方法中创建 Scanner 对象,然后传递给 calculateAverage 方法。
代码可读性: 可以使用更具描述性的变量名,并添加适当的注释,以提高代码的可读性。
优化后的代码示例:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double average;
String[] studentNames = new String[10];
for (int i = 0; i < 10; i++) {
System.out.println("What is the name of the student?");
studentNames[i] = scanner.nextLine();
System.out.println("What are their test scores?");
average = calculateAverage(scanner, i); // Pass the scanner object
System.out.println("Their average is " + average + ", that is a " + calculateGrade(average));
}
scanner.close(); // Close the scanner when finished
}
public static double calculateAverage(Scanner scanner, int studentIndex) {
double[][] gradebook = new double[10][5];
double sum = 0;
for (int testIndex = 0; testIndex < 5; testIndex++) {
gradebook[studentIndex][testIndex] = scanner.nextDouble();
sum += gradebook[studentIndex][testIndex];
}
scanner.nextLine(); // Consume the newline character after reading doubles
return sum / 5;
}
public static String calculateGrade(double average) {
if (average >= 90 && average <= 100) {
return "A";
} else if (average >= 80) {
return "B";
} else if (average >= 70) {
return "C";
} else if (average >= 60) {
return "D";
} else {
return "F";
}
}
}在这个优化后的版本中,Scanner 对象在 main 方法中创建,然后作为参数传递给 calculateAverage 方法。 此外,还添加了 scanner.nextLine(); 来消耗读取double数字后的换行符,避免影响后续的 nextLine() 读取。
Scanner 类是 Java 中处理用户输入的重要工具。通过在方法中创建 Scanner 对象,并使用 nextDouble()、nextLine() 等方法,可以方便地读取用户的输入。理解 Scanner 的工作原理,并注意代码的优化,可以编写出更高效、更易读的 Java 程序。 记住,在使用完 Scanner 对象后,应该调用 close() 方法来释放资源。
以上就是理解Java中的输入流:如何在方法中接收多个输入的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号