Java switch语句中一组字符串值的输入验证

Java switch语句中一组字符串值的输入验证,java,switch-statement,java.util.scanner,Java,Switch Statement,Java.util.scanner,我正在制作一个GPA计算器,它会提示用户输入他们的班级名称、学分和每个班级的期望字母分数。当提示输入预期的字母等级时,我无法找到有效的方法来验证用户的输入。以下是我目前掌握的情况: System.out.println("What grade did you earn in the class: A, A-, B+, B, B-, C+, C, C-, D+, D, or F?"); String[] grades ={"A", "A-", "B+", "B", "B-"

我正在制作一个GPA计算器,它会提示用户输入他们的班级名称、学分和每个班级的期望字母分数。当提示输入预期的字母等级时,我无法找到有效的方法来验证用户的输入。以下是我目前掌握的情况:

System.out.println("What grade did you earn in the class: A, A-, B+, B, B-, C+, C, C-, D+, D, or F?");
            String[] grades ={"A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "F"};
            firstGrade = scanner.nextLine();

            while (!firstGrade.equals(grades)) {
                System.out.println("Invalid input, please type a valid letter grade");
                firstGrade = scanner.nextLine();
            }
             switch(firstGrade){
                case "A":
                        System.out.println("Your GPA from " + firstClass +" is a 4.0");
                    break;
                case "A-":
                        System.out.println("Your GPA from " + firstClass +" is a 3.7");
                    break;
                case "B+":
                        System.out.println("Your GPA from " + firstClass +" is a 3.3");
                    break;
                case "B":
                        System.out.println("Your GPA from " + firstClass +" is a 3.0");
                    break;
                case "B-":
                        System.out.println("Your GPA from " + firstClass +" is a 2.7");
                    break;
                case "C+":
                        System.out.println("Your GPA from " + firstClass +" is a 2.3");
                    break;
                case "C":
                        System.out.println("Your GPA from " + firstClass +" is a 2.0");
                    break;
                case "C-":
                        System.out.println("Your GPA from " + firstClass +" is a 1.7");
                    break;
                case "D+":
                    System.out.println("Your GPA from " + firstClass +" is a 1.3");
                break;
                case "D":
                    System.out.println("Your GPA from " + firstClass +" is a 1.0");
                break;
                case "F":
                    System.out.println("Your GPA from " + firstClass +" is a 0.0");
                break;
             }
我试图在这个过程中使用数组,但不确定这是否是最好的方法。我只想让用户在没有输入正确的字母等级时得到警告,然后提示他们输入,直到他们输入为止

我尝试在switch语句中使用
default
,但在输入第一次失败后,无法让程序验证输入


有什么建议吗?

我强烈建议您使用
地图
,并完全取消
开关
。如果使用
LinkedHashMap
,则可以使用该
映射来显示选项(因为它保留了插入顺序)。最后,循环直到用户输入有效等级,然后显示相应的GPA。像

Map<String, Double> gradeMap = new LinkedHashMap<>();
gradeMap.put("A", 4.0);
gradeMap.put("A-", 3.7);
gradeMap.put("B+", 3.3);
gradeMap.put("B", 3.0);
gradeMap.put("B-", 2.7);
gradeMap.put("C+", 2.3);
gradeMap.put("C", 2.0);
gradeMap.put("C-", 1.7);
gradeMap.put("D+", 1.3);
gradeMap.put("D-", 1.0);
gradeMap.put("F", 0.0);
System.out.printf("What grade did you earn in the class: %s?%n",
        gradeMap.keySet().stream().collect(Collectors.joining(", ")));

String firstGrade = scanner.nextLine();
while (!gradeMap.containsKey(firstGrade)) {
    System.out.println("Invalid input, please type a valid letter grade");
    firstGrade = scanner.nextLine();
}
System.out.printf("Your GPA from %s is a %.1f%n", firstClass, 
    gradeMap.get(firstGrade));
Map gradeMap=newlinkedhashmap();
坡度图。放在(“A”,4.0);
坡度图。放在(“A-”,3.7);
等级图。放置(“B+”,3.3);
坡度图。放置(“B”,3.0);
坡度图。放置(“B-”,2.7);
等级图。放置(“C+”,2.3);
坡度图。放置(“C”,2.0);
坡度图。放置(“C-”,1.7);
等级图。放置(“D+”,1.3);
坡度图。放置(“D-”,1.0);
坡度图。放置(“F”,0.0);
System.out.printf(“你在这门课上得了什么分数:%s?%n”,
gradeMap.keySet().stream().collect(collector.joining(“,”));
字符串firstGrade=scanner.nextLine();
而(!gradeMap.containsKey(一级)){
System.out.println(“输入无效,请键入有效的字母等级”);
firstGrade=scanner.nextLine();
}
System.out.printf(“您从%s获得的GPA是%.1f%n”,头等舱,
等级图。获取(一级));

firstGrade
是一个
String
grades
是一个
String[]
,所以
firstGrade.equals(grades)
永远不会是真的。非常正确的安德烈亚斯,我忽略了我在比较字符串和字符串数组时,bid difference。感谢您指出这一点,这将向我展示JAVA语法是我要学习的,非常宽容,但也有欺骗性。作为一名初学者,我不知道“Map”和“LinkedHashMap”的功能。我记得在C#中发现了一个结果,但在JAVA中没有,所以这很好。感谢您使本项目的其余部分变得非常简单,因为它对每个类都是重复的。我将确保阅读更多关于“地图”及其功能的内容。今天再次回顾这个项目,到目前为止,一切都很好。但是,我想将每个班级的GPA分数存储在一个变量中。每节课一个变量,我可以在最后加上,得到学生最后一学期的平均成绩。如何做到这一点?我想我不明白“%s?%n”是什么意思,也不明白“你从%s获得的GPA是%.1f%n”是怎么回事。谢谢你,Elliot,这有点帮助。这就是我要说的System.out.printf(“您从%s获得的GPA是%.1f%n”,二等,成绩图.get(二等));”我如何将该类结果中的GPA值存储在变量中以供以后使用?谢谢Elliott,因此我将在这里分配一个变量来存储GPA点值。我从这个项目中学到了很多,并且在所有方面都使用了Map。谢谢你所做的一切。