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

How to read User input word by word from one line with scanner?

提问人:Jonathan Baxevanidis 提问时间:5/26/2021 最后编辑:HoomanJonathan Baxevanidis 更新时间:6/19/2021 访问量:967

问:

我正在尝试学习 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]

用户输入结束后,应显示当前学生的平均分数。
当用户输入学生的代码时,程序结束。
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);
    } 
}
java io java.util.scanner 用户输入

评论

1赞 Roy Varon 5/26/2021
你可能不想这样做,因为那只会比较两个指针。你是故意的吗?scanner.equals("end")course.equals("end")
0赞 Jonathan Baxevanidis 5/26/2021
即使改变它似乎也不会改变扫描仪读取输入的方式,
0赞 McModknower 5/26/2021
java 扫描器需要带有小数点而不是逗号的浮点数。如果将输入更改为 use 而不是 ,它可能会起作用。6.16,1

答:

1赞 FairOPShotgun 6/5/2021 #1

这是您问题的答案:

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();
  }   
}

输出:

Output

其工作原理如下:

为了使用 Scanner 扫描输入行,您需要使用正则表达式(或 REGular EXpression)。我使用正则表达式匹配器 更多信息 这里这里!检查 userInput 的格式是否正确后,将其与函数拆分。这会将整个输入(EX: 568 Pro 123)变成一个数组...[568,专业版,123]。一旦 userInput 是一个 Array,你就可以用变量来分配它了......这行代码会将“Pro”分配给变量“name”。从那里,您可以将其与您分配的其他变量一起使用。 这行代码将“568”分配给变量“gamescore”。Integer.parseInt() 是一个将 String 转换为数字的命令,因此 String 'parts[0]' 将转换为可以分配给“双精度变量”的数字。^(\\S+(?:\\h+\\S+)*)$.split(" ")String[] parts = userInput.split(" ");String name = parts[1]double gamescore = Integer.parseInt(parts[0]);