【问题标题】:How do I keep track the number of times a specific input was entered by the user?如何跟踪用户输入特定输入的次数?
【发布时间】:2015-01-07 16:41:47
【问题描述】:

我的程序应该要求用户输入一些成绩。输入完成后,程序必须显示输入了多少次(或者换句话说,每个年级输入了多少次)。

例如,如果用户输入 2 次 3 级,则意味着共有 2 名学生获得了 3 级。如果输入 3 次 F 级,则意味着 3 名学生获得了不及格的 F 级,以此类推。 ...

最终的输出应该是这样的:

    Example output: 
grade F= 3 students
grade 3= 2 studnets
and so on....
...........................
...........................

现在我的问题是跟踪每个年级并将它们打印出来,说明每个年级输入了多少次(也意味着有多少学生获得了每个特定的年级)。我想不出办法来解决它。

我的代码:

    package studentgrade;

import java.util.*;

public class StudentGrade {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("How many total grade you want to enter (Depending on the total number of students)? ");
        int totalStudents = input.nextInt();
        String grade[] = new String[totalStudents];

        //asking user to enter grade
        for (int i = 0; i < totalStudents; i++) {
            System.out.println("Enter grade " + (i + 1) + ": ");
            System.out.println("Choose only between grade 3 and F:\n");

            grade[i] = input.next();
            if (grade[i] == "3") {//3 defines the only passing grade
                //Store that into a variable
            } else if (grade[i].equalsIgnoreCase("F")) {//F defines the failing grade

                //Store that into a variable
            }//else{
            //System.out.println("Invalid input. Try again");
            //}
        }
        //Now print out which grade was entered how many times
    }
}

【问题讨论】:

  • 您需要使用额外的数组来存储有多少学生获得了特定的成绩。
  • 可以使用一个int数组,每个索引代表一个等级。当用户输入一个新等级时,将该等级索引中元素的值加1。
  • 或者您可以将所有成绩转储到一个数组或ArrayList,然后在您需要知道时只计算每种类型的数量。
  • 使用HashMap,键为等级。
  • 另外,你不能用==比较两个字符串。使用.equals()

标签: java arrays loops for-loop java.util.scanner


【解决方案1】:

在顶部定义一个类似于每个年级的变量并将它们设置为0,然后每次在“if”语句中,将相应的变量加1。 变量++

最后,使用

  System.out.println("Grade 3: " + variable3);
    System.out.println("Grade F: " + variableF);

另外,使用 .equals 方法比较 if 语句中的两个字符串

【讨论】:

    【解决方案2】:

    如果您不需要那种引入的值,只需创建一个具有所需大小的数组n(不知道从 3 到 F 的确切含义)。

    int[] grade = new int[n];
    

    如果所有输入都可以直接输入数字:

    grade[input.next()] ++;
    

    那么,由于不是所有输入都不是int,你可以用开关解决它

    switch(input.next()) {
         case "3":
              grade[0] ++;
         case "2":
              grade[1] ++;
         ....
         case "F":
              grade[n-1] ++;
    
     }
    

    【讨论】:

    • Input.next() 返回一个字符串,所以 case 3: 必须是 case "3":
    【解决方案3】:

    这对Map 很有用。现在你只存储输入 3F 但是如果你想调整这个程序以获得更多的成绩,这将完美地扩展,这是一个干净整洁的解决方案。

    // the map to store how many times a grade was entered
    private static final Map<String, Integer> gradeSumMap = new HashMap<String, Integer>();
    
    public static void addToGradeSum(String key, int num) {
        if(gradeSumMap.get(key) == null) {
            gradeSumMap.put(key, num);
        } else {
            gradeSumMap.put(key, gradeSumMap.get(key) + num);
        }
    }
    
    public static void printGradeSumMap() {
        for(String key : gradeSumMap.keySet()) {
            System.out.println("grade " + key + " = " + gradeSumMap.get(key));
        }
    }
    
    // this needs to also be .equals or .equalsIgnoreCase
    if (grade[i].equals("3")) {
        addToGradeSum(grade[i], 1);
    } else if (grade[i].equalsIgnoreCase("F")) {
        addToGradeSum(grade[i], 1);
    }
    

    然后当你想打印它时只需调用printGradeSumMap()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多