【问题标题】:Is it possible to shorten this if-else-if statement, and how do I do so?是否可以缩短这个 if-else-if 语句,我该怎么做?
【发布时间】:2017-10-16 03:45:36
【问题描述】:

我已经创建了这个 if-else-if 语句,我想知道我是否可以缩短它,这样它就不会占用太多空间。如果有人知道怎么做,请帮忙!

if (seatNum <= 20) System.out.println("Row 1");
else if (seatNum > 20 && seatNum <= 40) System.out.println("Row 2");
else if (seatNum > 40 && seatNum <= 60) System.out.println("Row 3");
else if (seatNum > 60 && seatNum <= 80) System.out.println("Row 4");
else if (seatNum > 80 && seatNum <= 100) System.out.println("Row 5");
else if (seatNum > 100 && seatNum <= 120) System.out.println("Row 6");
else if (seatNum > 120 && seatNum <= 140) System.out.println("Row 7");
else if (seatNum > 140 && seatNum <= 160) System.out.println("Row 8");
else if (seatNum > 160 && seatNum <= 180) System.out.println("Row 9");
else if (seatNum > 180 && seatNum <= 201) System.out.println("Row 10");
else if (seatNum > 201 && seatNum <= 216) System.out.println("Row 11");
else if (seatNum > 216 && seatNum <= 231) System.out.println("Row 12");
else if (seatNum > 231 && seatNum <= 246) System.out.println("Row 13");
else if (seatNum > 246 && seatNum <= 261) System.out.println("Row 14");
else if (seatNum > 261 && seatNum <= 276) System.out.println("Row 15");
else if (seatNum > 276 && seatNum <= 291) System.out.println("Row 16");
else if (seatNum > 291 && seatNum <= 306) System.out.println("Row 17");
else if (seatNum > 306 && seatNum <= 321) System.out.println("Row 18");
else if (seatNum > 321 && seatNum <= 336) System.out.println("Row 19");
else if (seatNum > 336 && seatNum <= 351) System.out.println("Row 20");

编辑:包括 201 号座位。对于所有的混乱,我们深表歉意! ????

【问题讨论】:

  • if (seatNum &lt;= 200) { System.out.println("Row "+ (int)Math.ceil(seatNum/(float)20)); } else if (seatNum &lt;= 216) { System.out.println("Row "+ (int)Math.ceil((seatNum-45)/(float)16)); } else if (seatNum &gt; 216) { System.out.println("Row "+ (int)Math.ceil((seatNum-49)/(float)15)); }
  • 201 怎么样。不落入任何状态!!!
  • 如果这是催眠秀,201 号座位可能是给假观众的。或者在戏剧方面可能只是不走运。不要诅咒他的代码人!
  • 我可能忘记在我的代码中包含 201 ????

标签: java if-statement


【解决方案1】:

我们可以利用 Java 中的int-divisions 总是向零舍入这一事实,即5 / 2 == 2-5 /2 == -2

对于seatNum &lt;= 0,行始终为1。 只要seatNum &lt;= 200,该行就是((seatNum - 1) / 20) + 1。如果是&gt; 201,我们可以直接取((seatNum - 202) / 15) + 11。我们减去202,因为数字是由2 抵消的:216 仍然在行11217 在行12231232 同样适用。通过这个计算,未定义的座位 201 将位于行中的位置 11,但忽略此输入或抛出 Exception 没什么大不了的。

// if (seatNum != 201) { // optional, to neglect seat 201
    System.out.print("Row: "); // yes, I am that lazy...
    if (seatNum <= 0) {
        System.out.println(1);
    } else if ((seatNum <= 200) /* && (seatNum > 0) */) {
        System.out.println(((seatNum - 1)/ 20) + 1);
    } else /* if (seatNum > 200) */ {
        System.out.println(((seatNum - 202) / 15) + 11);   
    }
// }

如果行变得更加复杂/不规则,我可能会部署DAle's solution 的细微变化。这看起来非常具有可读性和可扩展性。

【讨论】:

  • 数学不太对。 setNum == 20 应该产生 "Row 1",但你的产生 "Row: 2"。如果 setNum 为负数,它也会产生与 OP 不同的结果。
  • Nit:只有当座位号都是正数时才等效。这很可能,但应该注意。此外,Java 中的整数除法并不总是向下舍入——它总是向零舍入,对于正分子和分母来说为零。
  • OP 的代码中可能存在错误,因为 201 号座位似乎丢失了,使事情变得不必要地复杂。
  • @JohnBollinger 现在应该修复了。
  • @MickMnemonic 结果...我想得太复杂了。代码现在应该(相对)可读。
【解决方案2】:
int highestRowSeat[] = {20, 40, 80, 100, 120, 140, 160, 180, 200, 216, 231, 246, 261, 276, 306, 321, 336, 351};

for (int row = 1; row <= highestRowSeat.length; ++row) {
    if (seatNum <= highestRowSeat[row-1]) {
        System.out.println("Row " + row);
        break;
    }
}

【讨论】:

  • 您缺少一个角落案例(座位 201 未在 OPs 代码中定义),但除此之外,这看起来像是一个干净且可扩展的解决方案。
【解决方案3】:

您可以减少的一件事是检查次数,在这种情况下,由于您使用的是if...else,因此仅当前一个为假时才会检查以下条件,因此您可以删除大于 检查每个else if,因为它会被前一个自动检查。

编辑:添加了对缺少的 201 的额外检查

if (seatNum <= 20) System.out.println("Row 1");
else if (seatNum <= 40) System.out.println("Row 2");
else if (seatNum <= 60) System.out.println("Row 3");
else if (seatNum <= 80) System.out.println("Row 4");
else if (seatNum <= 100) System.out.println("Row 5");
else if (seatNum <= 120) System.out.println("Row 6");
else if (seatNum <= 140) System.out.println("Row 7");
else if (seatNum <= 160) System.out.println("Row 8");
else if (seatNum <= 180) System.out.println("Row 9");
else if (seatNum <= 200) System.out.println("Row 10");
else if (seatNum <= 216 && seatNum != 201) System.out.println("Row 11");
else if (seatNum <= 231) System.out.println("Row 12");
else if (seatNum <= 246) System.out.println("Row 13");
else if (seatNum <= 261) System.out.println("Row 14");
else if (seatNum <= 276) System.out.println("Row 15");
else if (seatNum <= 291) System.out.println("Row 16");
else if (seatNum <= 306) System.out.println("Row 17");
else if (seatNum <= 321) System.out.println("Row 18");
else if (seatNum <= 336) System.out.println("Row 19");
else if (seatNum <= 351) System.out.println("Row 20");

【讨论】:

  • Seat 201 在 OP 的代码中不存在,所以这并不完全等价。
  • 这在技术上是在缩短代码,但我指的是行数。
【解决方案4】:

两个值得探索的选项是使用TreeMap 和二分搜索。

使用 TreeMap,您可以执行以下操作:

private static final TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(20, 1);
map.put(40, 2);
//etc

然后在您的方法中(根据需要添加空检查):

int row = map.ceilingEntry(seatNum).getValue();

二分搜索选项如下所示:

private static final int[] rowEnds = { 20, 40, ... };

(该数组需要排序)并在您的方法中:

int rowIndex = Arrays.binarySearch(rowEnds, seatNum);
if (rowIndex < 0) rowIndex = - rowIndex + 1;
int row = rowEnds[rowIndex];

【讨论】:

    【解决方案5】:

    是的,当然

    String s = "";
    System.out.print("Row No. ");
    
    if      (seatNum <=  20) s = "1";
    else if (seatNum <=  40) s = "2";
    else if (seatNum <=  60) s = "3";
    else if (seatNum <=  80) s = "4";
    else if (seatNum <= 100) s = "5";
    else if (seatNum <= 120) s = "6";
    else if (seatNum <= 140) s = "7";
    else if (seatNum <= 160) s = "8";
    else if (seatNum <= 180) s = "9";
    else if (seatNum <= 200) s = "10";
    else if (seatNum <= 216) s = "11";
    else if (seatNum <= 231) s = "12";
    else if (seatNum <= 246) s = "13";
    else if (seatNum <= 261) s = "14";
    else if (seatNum <= 276) s = "15";
    else if (seatNum <= 291) s = "16";
    else if (seatNum <= 306) s = "17";
    else if (seatNum <= 321) s = "18";
    else if (seatNum <= 336) s = "19";
    else if (seatNum <= 351) s = "20";
    
    System.out.println(s);
    

    【讨论】:

      【解决方案6】:

      我想提一下Conditional Operator ? :。虽然它确实节省了那么多空间,但最好记住这一点,因为一些程序员认为它更具可读性并且在执行时一点点faster

      String row = (seatNum <= 20)  ? "Row 1"  : (seatNum <= 40)  ? "Row 2"  :
                   (seatNum <= 60)  ? "Row 3"  : (seatNum <= 80)  ? "Row 4"  :
                   (seatNum <= 100) ? "Row 5"  : (seatNum <= 120) ? "Row 6"  :
                   (seatNum <= 140) ? "Row 7"  : (seatNum <= 160) ? "Row 8"  :
                   (seatNum <= 180) ? "Row 9"  : (seatNum <= 200) ? "Row 10" :
                   (seatNum <= 216) ? "Row 11" : (seatNum <= 231) ? "Row 12" :
                   (seatNum <= 246) ? "Row 13" : (seatNum <= 261) ? "Row 14" :
                   (seatNum <= 276) ? "Row 15" : (seatNum <= 291) ? "Row 16" :
                   (seatNum <= 306) ? "Row 17" : (seatNum <= 321) ? "Row 18" :
                   (seatNum <= 336) ? "Row 19" : (seatNum <= 351) ? "Row 20" : null;
      
      System.out.println(row); // to see the result
      

      【讨论】:

      • 请注意,它的正确名称是conditional operator
      • 一位老师告诉我不要使用这些。你同意吗?
      • @ap 这取决于你的老师为什么不推荐使用它们!条件运算符 ? : 很受欢迎,但是,您老师的观点可能是出于可读性目的,因为初学者看到它们时可能会感到困惑!
      【解决方案7】:

      让我们为您的代码创建一个方法。由于return 关键字终止了该方法,因此可以使用它来缩短if-else 树,如下所示:

      public static void main(String[] args) {
          ArrayList<Integer>index=new ArrayList<Integer>();
          ArrayList<String>excep=new ArrayList<String>();
          for (int i = 0; i < 400; i++) {
              if(!seat(i).equals(seat(i-1))){
                  excep.add(seat(i-1));
                  index.add(i);
              }
          }
      
          for (int test = 0; test < 400; test++) {
              if(test<352){
                  int i=0;
                  for(;i<index.size();i++){
                      if(index.get(i)-test>=0){
                          if(index.get(i)-test==0)
                              i++;
                          break;
                      }   
                  }
                  System.out.println(excep.get(i));;  
              }else if(test==201){
                  System.out.println(seat(test));
              }else
                  System.out.println("null");
          }       
      
      }
      
      public static String seat(int seatNum) {
          if (seatNum <= 20)
              return ("Row 1");
          else if (seatNum <= 40)
              return ("Row 2");
          else if (seatNum <= 60)
              return ("Row 3");
          else if (seatNum <= 80)
              return ("Row 4");
          else if (seatNum <= 100)
              return ("Row 5");
          else if (seatNum <= 120)
              return ("Row 6");
          else if (seatNum <= 140)
              return ("Row 7");
          else if (seatNum <= 160)
              return ("Row 8");
          else if (seatNum <= 180)
              return ("Row 9");
          else if (seatNum <= 200)
              return ("Row 10");
          else if (seatNum <= 216)
              return ("Row 11");
          else if (seatNum <= 231)
              return ("Row 12");
          else if (seatNum <= 246)
              return ("Row 13");
          else if (seatNum <= 261)
              return ("Row 14");
          else if (seatNum <= 276)
              return ("Row 15");
          else if (seatNum <= 291)
              return ("Row 16");
          else if (seatNum <= 306)
              return ("Row 17");
          else if (seatNum <= 321)
              return ("Row 18");
          else if (seatNum <= 336)
              return ("Row 19");
          else if (seatNum <= 351)
              return ("Row 20");
          return "null";
      }
      

      【讨论】:

      • 这比我之前的要长一些。
      【解决方案8】:
      if (seatNum <= 200) {
          System.out.println("Row "+ ceil(seatNum/20));
      }
      else if (seatNum <= 216) {
          System.out.println("Row "+ ceil((seatNum-45)/16));
      }
      else if (seatNum > 216) {
          System.out.println("Row "+ ceil((seatNum-49)/15));
      }
      

      我不知道正确的函数名称或关于 Java 的任何信息,但它的逻辑是可行的

      【讨论】:

      • ceil 除了在此处将 int 表达式 seatNum/20 转换为 double 之外没有任何作用。您需要确保使用浮点除法,例如Math.ceil(seatNum / 20.0).
      • 是的,我知道那不是 Java,我只是把一般的 jist 放在那里 :)
      【解决方案9】:

      这个呢……

      if(seatNum <= 0 ) 
          System.out.println("Row 1");
      if(seatNum <= 200)
          System.out.print("Row "+ (int)Math.ceil(seatNum /20.00));
      else
          System.out.print("Row "+ (int)Math.ceil((seatNum-201) /15.00 + 10));
      

      【讨论】:

      • 每个间隔不是20
      • 仍然有问题。通过此计算,座位 216 将位于行 12 而不是行 11。此外,您的输出与编号 &lt; 0 的 OP 代码不对应。还有座位有问题201...
      【解决方案10】:

      你可以简单地写:

      System.out.println("Row " + ((seatNum <= 200)?
                                  ((Math.max(20, seatNum) - 1) / 20) + 1 
                                : ((seatNum - 202) / 15) + 11));
      

      我忽略了201 的情况,这可能是一个错误(如有必要,将202 更改为201)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 2019-12-23
        • 1970-01-01
        • 2023-03-15
        • 2012-04-25
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        相关资源
        最近更新 更多