【问题标题】:How do i use switch statement inside a method such that the method can return a char value which is acquired by the switch statement inside it?如何在方法中使用 switch 语句,以便该方法可以返回一个 char 值,该值由其中的 switch 语句获取?
【发布时间】:2019-02-07 19:37:45
【问题描述】:

此方法假设计算获得的分数的平均值并相应地返回分数。 我如何将成绩从 switch() 传递到 calculate() 以便它可以返回正确的成绩?

public char calculate(){

    int count=0;
    int total = 0;
     for (int x: testScores){
             total = total + x;
             count++;
     }  

     int grade = total/count;

        switch(grade){
                case (1): if (grade>=90) return 'O';
                break;
                case(2): if (grade>=80 && grade<90) return 'E';
                break;
                case (3): if (grade>=70 && grade<80) return 'A';
                break;
                case (4): if (grade>=55 && grade<70) return 'P';
                break;
                case (5): if (grade>=40 && grade<55) return 'D';
                break;
                case (6): if (grade<40) return 'E';
                break;
            }
            return //what should i return here??

    }

我知道如何在没有 switch() 的情况下做到这一点,但我认为也可以这样做。 请告诉我我错过了什么?

【问题讨论】:

  • 如果切换grade时匹配case (1),则匹配grade == 1,所以不是&gt;= 90。我觉得你有点糊涂了。
  • 简单地返回一些虚拟值 - 没关系 - 只是为了让编译器静音。 (编译器未检测到,该行不可达)

标签: java methods switch-statement return


【解决方案1】:

关于你的问题:

  • 不需要最后的返回,只需以default 子句结束switch 并在那里返回默认值。
  • 没有必要使用break 语句,因为你正在使用 return 每种情况

此外,如果您将自己限制为仅使用 switch,那么这是实现目标的一种更简单的方法:

char calculate(int[] scores) {
  double averageScore = Arrays.stream(scores).average().getAsDouble();
  int nearestMultipleOfFive = 5 * ((int) averageScore / 5);
  switch (nearestMultipleOfFive) {
    case 100:
    case 95: 
    case 90: return 'O';
    case 85:
    case 80: return 'E';
    case 75: 
    case 70: return 'A';
    case 65: 
    case 60:
    case 55: return 'P';
    case 50: 
    case 45:
    case 40: return 'D';
    default: return 'E';
  }
}

【讨论】:

    【解决方案2】:

    由于您使用 switch 语句覆盖了所有情况,并且您立即为每个情况返回,因此您不应该在那里做任何事情,您将永远无法到达代码的那部分。 在您当前拥有的代码中,break 语句也是无用的,因为在任何情况下都不会到达它,因为它再次被 return 语句预期。

    如果您想在最后返回一次值,您可以稍微修改您的代码,方法是将 switch case 的结果存储在先前定义的变量中并在最后返回那个值。

    【讨论】:

    • 如果没有一些虚拟返回值,它将无法编译。由于编译器没有检测到所有可能的值已经被覆盖(它会抱怨缺少返回!)。所以OP只需要st。使编译器静音。
    【解决方案3】:

    如果您将最后一个 case 切换为 default 而不是实际值,则无需在 switch 语句之后返回任何内容。

    更广泛地说,您在每个 case 中的 if 语句是可疑的。 grade == 1grade &gt;= 90 怎么可能?唯一可能工作的是案例 6,因为 6 也 grade 的值与这些数字进行比较决定执行什么案件。

    我认为有一种更简单的方法可以表达这种逻辑。看起来grade 将是他们的数字等级(即在 0 到 100 之间,虽然理论上它也可能是负数),所以我会放弃 switch 语句,只使用 if/else:

      if (grade >= 90) {
         return 'O';
      } else if (grade >= 80 && grade < 90) {
         return 'E';
      } else if (grade >= 70 && grade < 80) {
         return 'A';
      } else if (grade >= 55 && grade < 70) {
         return 'P';
      } else if (grade >= 40 && grade < 55) {
         return 'D';
      } else {
         return 'E';
      }
    

    注意最后一条语句只是else,没有任何条件。这使它像switch 语句中的default 案例一样工作:它将捕获任何不符合其他条件的值。

    【讨论】:

      【解决方案4】:

      在您的开关中,您跳转到不同的部分,检查grade 是否为 1、2、3 等。但是然后您将其与 0 到 100 范围内的值进行比较?这永远不会成功。

      但是你根本不需要switch,你可以使用一系列if语句

      public char calculate(){
      
        int count=0;
        int total = 0;
        for (int x: testScores){
          total = total + x;
          count++;
        }  
      
        int grade = total/count; //what if count is 0?
      
        if (grade>=90) return 'O';
        if (grade>=80) return 'E';
        if (grade>=70) return 'A';
        if (grade>=55) return 'P';
        if (grade>=40) return 'D';
        return 'E';
      }
      

      并且一定要覆盖count为0的情况,这里我没有做,因为我不知道那会是什么结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多