如何用扫描仪从一行中逐字读取用户输入?

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'.