在case语句内部使用if、else if、else和循环结构代替switch语句。

7

针对我的问题,我只列举了第一种情况,但其他情况也是相同的。假设目前 value 的值为 1,我们进入 case 1 并循环遍历数组查看每个元素是否与 whatever_value 变量匹配。在这种情况下,如果匹配成功,我们会将 value 变量声明为等于 2,并且跳出循环。问题在于,当我在 eclipse 中选择其他 break 时,它显示这些 break 也与 for 语句相关联,但我只想让 for 语句与 if 语句相关联,而不是与 else if 语句相关联。我以为因为 for 语句没有括号,所以它只循环 if 语句,但是 eclipse 显示否定(else if 也从 0 循环到数组长度)。

  switch (value) {
  case 1:
     for (int i = 0; i < something_in_the_array.length; i++)
        if (whatever_value == (something_in_the_array[i])) {
           value = 2;
           break;
        } else if (whatever_value == 2) {
           value = 3;
           break;
        } else if (whatever_value == 3) {
           value = 4;
           break;
        }
     break;
  case 2:

  // code continues....

4
一条小建议:不要混用制表符和空格,否则会破坏格式,就像你现在看到的那样。 - Mysticial
因为for语句也循环了else if语句,而我不想这样做,但不知道如何使只有if语句被循环。因此,为了避免循环我们数组的长度(如果else if语句匹配),我插入了一个break。然而,如果else if语句不匹配,它仍然会循环整个数组的长度。这很令人困惑,我的代码也很混乱,我理解。我的问题只是如何使只有if语句被循环,而不是else if。 - BubbleTree
5个回答

12

我认为你的问题是for循环包含了所有的if、else if语句,这些语句像hoang nguyen指出的那样像一个语句。

请将代码更改为以下方式。注意方括号表示for循环作用的代码块以及第一个else if变成了if。

switch(value){

    case 1:
        for(int i=0; i<something_in_the_array.length;i++) {
            if(whatever_value==(something_in_the_array[i])) {
                value=2;
                break;
             }
        }

        if(whatever_value==2) {
            value=3;
            break;
        }
        else if(whatever_value==3) {
            value=4;
            break;
        }
        break;


    case 2:

code continues....

哦!谢谢,原来是这样做的,我试图将if语句放在for循环中括号内,但由于else if与if相连,它不允许我这样做。然而,如果我为循环单独使用if语句,就像你展示的那样,它会起作用。谢谢! - BubbleTree
@eboix - "// 这实际上就像是一个 else if,因为如果前面的 if 语句不执行,它也不会被执行。" - 不正确。for 循环中的 break 会跳出循环到结尾处。接下来执行的语句将是下一个 if 语句! - Stephen C
@StephenC 我当时在想什么... 你完全正确。我甚至不知道我怎么被点赞了 :P - eboix

3

很棒的解决方案!直到今天我都不知道这些存在,而我已经用Java编程超过5年了。 - Jiman

2

但我只想让for语句与if语句相关联,而不是与else if语句相关联。

那就去掉else。如果else if不应该是for的一部分,那么可以这样写:

           for(int i=0; i<something_in_the_array.length;i++)
                if(whatever_value==(something_in_the_array[i]))
                {
                    value=2;
                    break;
                }

           if(whatever_value==2)
           {
                value=3;
                break;  // redundant now
           }

           else if(whatever_value==3)
           {
                value=4;
                break;  // redundant now
           }

话虽如此:

  • 你真正想要做什么并不清楚,
  • 在循环中没有else部分似乎没有太多意义,
  • 许多人(包括我自己)认为最好总是使用大括号...这样人们在阅读代码时就不会被错误的缩进所困扰。 (在这种情况下,它可能有助于我们弄清楚你真正想要做什么...)

最后,如果您将左括号放在前一行的结尾,则左右括号会更不突兀;例如:

  if (something) {
     doSomething();
  }

而不是:

  if (something) 
  {
     doSomething();
  }

2

似乎这种方法有点朴素,但如果必须这样做,您可以按照以下方式进行重组以适应您的需求:

boolean found = false;

case 1:

for (Element arrayItem : array) {
    if (arrayItem == whateverValue) {
        found = true;    
    } // else if ...
}
if (found) {
    break;
}
case 2:

2
如果你需要 for 语句只包含 if,你需要移除它的 else,像这样:
for(int i=0; i<something_in_the_array.length;i++)
    if(whatever_value==(something_in_the_array[i]))
    {
        value=2;
        break;
    }

    /*this "else" must go*/
    if(whatever_value==2)
    {
        value=3;
        break;
    }

    else if(whatever_value==3)
    {
        value=4;
        break;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接