Java Switch语句-是否可以使用“或” /“和”?


77

我实现了一种字体系统,该字体系统通过char switch语句找出要使用的字母。我的字体图像中只有大写字母。我需要这样做,例如,“ a”和“ A”都具有相同的输出。而不是案件数量的两倍,它可能像下面这样:

char c;

switch(c){
case 'a' & 'A': /*get the 'A' image*/; break;
case 'b' & 'B': /*get the 'B' image*/; break;
...
case 'z' & 'Z': /*get the 'Z' image*/; break;
}

这在Java中可能吗?


5
我只想指出,我已经有很长时间没有使用switch语句了,并且几乎每天都在编写Java。原因是我发现它的风格不好,因为它有点像goto,而且总有另外一种我更喜欢的解决方案。在您的情况下,您可以使用Map或枚举(通常是一个很好的替代品),并使用方法boolean match(char c)和File getImage()
MichaelSchmeißer2012年

5
@MichaelSchmeißer在这种情况下,那么您可能还想重新考虑使用for / while循环,因为它们是Goto / s的另一种形式。这就是为什么它们还包含break / continue关键字的原因。严格地说,'switch'不是goto,因为它提供了自己的块范围。它只是工具箱中的另一个工具,对于这种特定的用例,它也是最合适的。
伊万·普赖斯

Answers:


191

您可以通过省略该break;语句来使用切换大小写掉线。

char c = /* whatever */;

switch(c) {
    case 'a':
    case 'A':
        //get the 'A' image;
        break;
    case 'b':
    case 'B':
        //get the 'B' image;
        break;
    // (...)
    case 'z':
    case 'Z':
        //get the 'Z' image;
        break;
}

...或者您可以在输入之前将标准化为小写大写switch

char c = Character.toUpperCase(/* whatever */);

switch(c) {
    case 'A':
        //get the 'A' image;
        break;
    case 'B':
        //get the 'B' image;
        break;
    // (...)
    case 'Z':
        //get the 'Z' image;
        break;
}

啊,谢谢那个例子。我曾考虑过将输入字符串全部大写,但不知道这样做的可能性,所以也感谢第二个示例。
GlassZee 2012年

10
实际上,在c需要保留的情况下,我会把toUpperCase交换机放在内部。但是+1,因为这样可以节省很多行不必要的case语句:-)
paxdiablo 2012年

21

上面的意思是“或”不是“与”。AND的示例:110&011 == 010既不是您要找的东西。

对于OR,只有2个案例在1日没有中断。例如:

case 'a':
case 'A':
  // do stuff
  break;

6
我不知道第一点对OP有多大帮助。
马特·鲍尔

1
@MДΓΓБДLL:关于AND的评论表明了OP为什么要OR而不是AND的原因。OR部分与接受的答案相同,所以我希望它是相关的。
黛娜2012年

7

以上都是很好的答案。我只是想补充一点,当要检查多个字符时,if-else可能会更好,因为您可以改写以下内容。

// switch on vowels, digits, punctuation, or consonants
char c; // assign some character to 'c'
if ("aeiouAEIOU".indexOf(c) != -1) {
  // handle vowel case
} else if ("!@#$%,.".indexOf(c) != -1) {
  // handle punctuation case
} else if ("0123456789".indexOf(c) != -1) {
  // handle digit case
} else {
  // handle consonant case, assuming other characters are not possible
}

当然,如果这变得更加复杂,我建议您使用正则表达式匹配器。


3
== 0是不正确的。这就是说“是c字符串的第一个字符吗?”,您可能想要>= 0!= -1
休恩

1
@dbaupp:糟糕,您是对的。我在想用compareTo()代替indexOf()。固定。
scorpiodawg 2012年

1
这些测试中的某些测试可以用中的现有方法代替Character,例如“是数字”情况。
马特·鲍尔

1

据我对您的问题的了解,在将字符传递到switch语句之前,可以将其转换为小写。因此,您不必担心大写字母,因为它们会自动转换为小写字母。为此,您需要使用以下功能:

Character.toLowerCase(c);

1

一个有趣的观察Switch case陷阱- >fall throughswitch

“ break语句是必需的,因为没有它们,开关块中的语句就会掉入:” Java Doc的示例

连续的摘录,casebreak

    char c = 'A';/* switch with lower case */;
    switch(c) {
        case 'a':
            System.out.println("a");
        case 'A':
            System.out.println("A");
            break;
    }

在这种情况下,O / P为:

A

但是,如果您更改c的值,即 char c = 'a';,那么这会很有趣。

在这种情况下,O / P为:

a A

即使第二个案例测试失败,程序也会A由于丢失break而进入打印状态,这导致switch将其余代码视为一个块。匹配的案例标签之后的所有语句将按顺序执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.