如何用扫描仪从一行中逐字读取用户输入?
How to read User input word by word from one line with scanner?
我正在尝试学习 java,更具体地说是扫描仪。因此,我尝试创建一个简单的程序,将学生代码 Course1 course1Degree course2 course2Degree 等作为输入,直到用户输入单词 end。当用户输入结束时,是时候为另一个学生输入相同的信息了。更详细的输入如下:
061125 Programming1 6,1 DB1 7,0 Math1 5,5 end[enter]
071234 DB2 5,5 Java 7,3 end[enter]
012343 end[enter]
用户输入end[enter]后,应显示当前学生的平均分。
当用户输入学生代码 0000[enter]
.
时程序结束
我的问题是,无论我为计算每个学生的平均分而尝试过什么,我都无法读取正确的输入。此外,它似乎不明白什么时候输入 [end] 以及在第一次输入之后我在输入 0000 时做了什么程序不会停止。这是我目前的情况。
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
readline();
}
static void readline(){
Scanner scanner = new Scanner(System.in).useDelimiter("\s");
String course = "";
String code = "";
float mark = 0;
System.out.println("Enter student details: ");
while(!course.equals("end")){
code = scanner.nextLine();
if (code.equals("0000")) {
System.exit(0);
} else {
course = scanner.next();
float sum = 0;
while (!scanner.equals("end")){
mark += scanner.nextFloat();
sum += mark;
System.out.println("sum: " + sum);
}
}
}
System.out.println("Final creds: " + " id: "+ code + " course: " + course + " mark: " + mark);
}
}
您的问题的答案如下:
import java.util.Scanner;
public class Test {
static String course;
static double mark;
static int id;
static int times = 1;
static double avgmark;
static void readline(){
System.out.println("Enter student details in the format: [Final creds] [ID] [Course]");
while(true){
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
if (userInput.equals("y")){
times++;
System.out.println("Type in your next mark:");
Double nextMark = scanner.nextDouble();
mark += nextMark;
System.out.println("Would you like to add another mark? [y/n]");
continue;
} else if (userInput.equals("n")){
break;
} else if (userInput.matches("^(\S+(?:\h+\S+)*)$")) {
String[] parts = userInput.split(" ");
mark = Integer.parseInt(parts[0]);
id = Integer.parseInt(parts[1]);
course = parts[2];
System.out.println("Would you like to add another mark? [y/n]");
continue;
}
}
avgmark = mark/times;
avgmark *= 100;
avgmark = Math.round(avgmark);
avgmark /= 100;
System.out.println("\nStudent Information: \nID: #"+ id + "\nCourse: " + course + " \nTotal Marks: " + mark +"\nAvg. Mark: "+avgmark + "%");
}
public static void main(String[] args) {
readline();
}
}
输出:
工作原理如下:
为了使用扫描仪扫描一行输入,您需要使用正则表达式(或 REGular EXpression ). 我使用正则表达式匹配器 ^(\S+(?:\h+\S+)*)$
更多信息 and !检查 userInput 格式是否正确后,使用 .split(" ")
函数将其拆分。这会将整个输入 (EX: 568 Pro 123) 变成一个数组... String[] parts = userInput.split(" ");
[568, Pro, 123].一旦 userInput 是一个数组,您就可以为其分配变量...String name = parts[1]
。这行代码会将 'Pro' 赋值给变量 'name'。从那里,您可以将它与您分配的其他变量一起使用。 double gamescore = Integer.parseInt(parts[0]);
这行代码将'568' 赋值给变量'gamescore'。 Integer.parseInt()是一个将String转成数字的命令,所以String'parts[0]'转成一个数字,可以赋给一个'double variable'.
我正在尝试学习 java,更具体地说是扫描仪。因此,我尝试创建一个简单的程序,将学生代码 Course1 course1Degree course2 course2Degree 等作为输入,直到用户输入单词 end。当用户输入结束时,是时候为另一个学生输入相同的信息了。更详细的输入如下:
061125 Programming1 6,1 DB1 7,0 Math1 5,5 end[enter]
071234 DB2 5,5 Java 7,3 end[enter]
012343 end[enter]
用户输入end[enter]后,应显示当前学生的平均分。
当用户输入学生代码 0000[enter]
.
我的问题是,无论我为计算每个学生的平均分而尝试过什么,我都无法读取正确的输入。此外,它似乎不明白什么时候输入 [end] 以及在第一次输入之后我在输入 0000 时做了什么程序不会停止。这是我目前的情况。
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
readline();
}
static void readline(){
Scanner scanner = new Scanner(System.in).useDelimiter("\s");
String course = "";
String code = "";
float mark = 0;
System.out.println("Enter student details: ");
while(!course.equals("end")){
code = scanner.nextLine();
if (code.equals("0000")) {
System.exit(0);
} else {
course = scanner.next();
float sum = 0;
while (!scanner.equals("end")){
mark += scanner.nextFloat();
sum += mark;
System.out.println("sum: " + sum);
}
}
}
System.out.println("Final creds: " + " id: "+ code + " course: " + course + " mark: " + mark);
}
}
您的问题的答案如下:
import java.util.Scanner;
public class Test {
static String course;
static double mark;
static int id;
static int times = 1;
static double avgmark;
static void readline(){
System.out.println("Enter student details in the format: [Final creds] [ID] [Course]");
while(true){
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
if (userInput.equals("y")){
times++;
System.out.println("Type in your next mark:");
Double nextMark = scanner.nextDouble();
mark += nextMark;
System.out.println("Would you like to add another mark? [y/n]");
continue;
} else if (userInput.equals("n")){
break;
} else if (userInput.matches("^(\S+(?:\h+\S+)*)$")) {
String[] parts = userInput.split(" ");
mark = Integer.parseInt(parts[0]);
id = Integer.parseInt(parts[1]);
course = parts[2];
System.out.println("Would you like to add another mark? [y/n]");
continue;
}
}
avgmark = mark/times;
avgmark *= 100;
avgmark = Math.round(avgmark);
avgmark /= 100;
System.out.println("\nStudent Information: \nID: #"+ id + "\nCourse: " + course + " \nTotal Marks: " + mark +"\nAvg. Mark: "+avgmark + "%");
}
public static void main(String[] args) {
readline();
}
}
输出:
工作原理如下:
为了使用扫描仪扫描一行输入,您需要使用正则表达式(或 REGular EXpression ). 我使用正则表达式匹配器 ^(\S+(?:\h+\S+)*)$
更多信息 .split(" ")
函数将其拆分。这会将整个输入 (EX: 568 Pro 123) 变成一个数组... String[] parts = userInput.split(" ");
[568, Pro, 123].一旦 userInput 是一个数组,您就可以为其分配变量...String name = parts[1]
。这行代码会将 'Pro' 赋值给变量 'name'。从那里,您可以将它与您分配的其他变量一起使用。 double gamescore = Integer.parseInt(parts[0]);
这行代码将'568' 赋值给变量'gamescore'。 Integer.parseInt()是一个将String转成数字的命令,所以String'parts[0]'转成一个数字,可以赋给一个'double variable'.