【问题标题】:Fully utilizing a switch statement充分利用 switch 语句
【发布时间】:2015-09-25 07:40:57
【问题描述】:

我的 Java 教科书问我以下错误:

switch (score)
        {
            case (score > 90):
                grade = 'A';
                break;
            case (score > 80):
                grade = 'B';
                break;
            default:
                grade = 'C';
        }

我已经知道错误在哪里了:

  • Switch 语句不是为比较而构建的,例如(score > 90);这适用于 if/else 语句。

但这让我想知道: switch 语句如何有效地解释整数范围?

我能想到的最明显的例子如下,但我觉得它相当暴力:

switch (score)
    {
        case 90: case 91: case 92: case 94: case 95:
        case 96: case 97: case 98: case 99: case 100:
            grade = 'A';
            break;
        case 80: case 81: case 82: case 84: case 85:
        case 86: case 87: case 88: case 89:
            grade = 'B';
            break;
        default:
            grade = 'C';
    }

这样的概念还能如何在 switch 语句中表达?

【问题讨论】:

  • 为什么不允许你使用if-else
  • 使用 switch 语句没有其他方法可以做到这一点。这就是你使用 if 语句的原因:)
  • @Mark 您的问题我不清楚:从您的代码示例看来,您似乎已经知道 switch 语句可以做什么和不能做什么。因此,在上述情况下,您显然 不应该 使用它,因为您正在处理范围。当您要处理精确值时,使用 switch/case 可能是合适的。
  • 蛮力法居然行不通!如果某人的分数是 92.4,会发生什么?

标签: java switch-statement


【解决方案1】:

在某些编程语言中是这样的

switch (true) {
  case (0 <= val &&  val < 1000): /* do something */ break;
  case (1000 <= val &&  val < 2000): /* do something */ break;
  ...
  case (29000 <= val &&  val < 30000): /* do something */ break;
}

是可能的,但首先它的性能不是很好,第二个 java 不接受这一点。所以使用 if-then-else:

 int val = 500;
 if (0 <= val &&  val < 1000){ System.out.println("Test");}
 else if (1000 <= val &&  val < 2000){ /* do something */}
 else if (29000 <= val &&  val < 30000){ /* do something */}

【讨论】:

    【解决方案2】:

    我刚刚制作的这个版本可以认为更优雅:

     int score_new = score/10 
    
    \\This gets you the first digit.. make sure score_new is int and not double
    
    switch (score_new)
    
    {
       case 10: case 9:
            grade = 'A';
            break;        
        case 8:
            grade = 'B';
            break;
        default:
            grade = 'C';
    }
    

    【讨论】:

      【解决方案3】:

      可能不是最佳答案,但可以使用非常简单的方法

      int temp;
      
      if(score > 90) 
       temp = 1;
      else if(score > 80) 
       temp = 2;
      
      
      switch (temp)
              {
                  case (1):
                      grade = 'A';
                      break;
                  case (2):
                      grade = 'B';
                      break;
                  default:
                      grade = 'C';
              }
      

      【讨论】:

        【解决方案4】:

        如果您利用分数随10 的每次变化而变化的事实,并假设score 是整数数据类型,那么您可以除以10 以消除大多数情况:

        switch (score / 10)
        {
            case 9:
            case 10:
                grade = 'A';
                break;
            case 8:
                grade = 'B';
                break;
            default:
                grade = 'C';
        }
        

        如果没有这样的规则(如果“等级”存储桶大小不同且任意),那么您能做的最好的就是 if/else-if/else 语句。

        【讨论】:

          【解决方案5】:

          在 Java 中,switch 语句只能测试 int 值(从 Java 1.0 开始)、枚举值(从 Java 5.0 开始)和字符串值(从 Java 7.0 开始),并且只能测试是否相等。请注意,byteshortchar 可以向上转换为 int。但无法测试longfloatdouble 值。

          法律示例:

          int x = (...);
          switch (x) {
              case 0: (...)
          }
          
          byte x = (...);
          switch (x) {
              case 0: (...)
          }
          
          String x = (...);
          switch (x) {
             case "a": (...)
          }
          

          非法示例:

          long x = (...);
          switch (x) {
              case 0: (...)
          }
          
          double x = (...);
          switch (x) {
              case 0.0: (...)
          }
          

          【讨论】:

          • 问题是:“这样的概念还能如何在 switch 语句中表达?”
          【解决方案6】:

          对于您的情况,if 语句更好且易读。 switch 语句适用于少量 intenum 值。

          【讨论】:

            【解决方案7】:

            简短的回答:不能。 长答案: switch 语句不能接受这样的表达式,因为 switch 语句对变量的单个值进行操作,而不是像您展示的那样对变量范围进行操作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-07-22
              • 2011-12-11
              • 2015-05-02
              • 1970-01-01
              • 2016-03-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多