【问题标题】:How to read User input word by word from one line with scanner?如何使用扫描仪从一行中逐字读取用户输入?
【发布时间】:2021-05-25 17:39:26
【问题描述】:

我正在尝试学习 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);
    } 
}

【问题讨论】:

  • 你可能不想做scanner.equals("end") 因为那只会比较两个指针。你的意思是改用course.equals("end") 吗?
  • 即使改变似乎也不会改变扫描仪读取输入的方式,
  • java 扫描器需要带小数点而不是逗号的浮点数。如果您将输入更改为使用6.1 而不是6,1,它可能会起作用。

标签: java io java.util.scanner user-input


【解决方案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();
  }   
}

输出:

它的工作原理如下:

要使用扫描仪扫描输入行,您需要使用正则表达式(或 REGular EXpression)。 我使用正则表达式匹配器 ^(\\S+(?:\\h+\\S+)*)$ 有关它的更多信息here 和here!检查 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() 是将字符串转换为数字的命令,因此字符串 'parts[0]' 转换为可以分配给“双变量”的数字。

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2022-01-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多