我可以在单个开关中使用一系列值吗?

问题描述:

我试图简化一个Card类,并想知道是否有任何方法在switch语句中使用一系列值?我可以在单个开关中使用一系列值吗?

考虑:

if((card<14)) 
    suit="Hearts"; 
    else 
    if((card>14)&&(card<27)) 
     suit="Clubs"; 

      etc. 

相反,我想使用switch语句,如:

switch(card){ 
    case1: through case13: 
    suit="Hearts"; 
    break; 

     etc. 

我没能找到Java教程任何建议有这种开关的变化。但是那里?

+0

不,你不能... – 2012-03-22 19:49:48

+4

对于这种特殊情况,你可以在'(card-1)/ 13'上做一个'switch',或者类似的东西。 – 2012-03-22 19:51:42

+0

@LouisWasserman:如果我读了这个权利,'int foo =(card-1)/ 13;'将产生整数值1-4,然后可以将其传递给'switch'。我是否理解正确? – dwwilson66 2012-03-23 19:42:19

关于你能做的最好的是这样的(见下文)。所以在某些情况下(没有双关语:)),最好使用if语句。

switch(card){ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    case 9: 
    case 10: 
    case 11: 
    case 12: 
    case 13: 
     suit="Hearts"; 
     break; 
} 

但是,您可以考虑的另一种方法是使用地图。

Map<Integer, String> map = new HashMap<Integer, String>(); 
for (int i = 1; i <= 14; ++i) { 
    map.put(i, "Hearts"); 
} 
for (int i = 15; i <= 26; ++i) { 
    map.put(i, "Clubs"); 
} 

然后,你可以使用地图查找卡的西装。

String suit1 = map.get(12); // suit1 will be Hearts after the assignment 
String suit2 = map.get(23); // suit2 will be Clubs after the assignment 
+2

Map ...另一个有趣的功能超出了我的新手...我有一个周末的研究项目或两个。 :) 谢谢。 – dwwilson66 2012-03-23 19:36:18

Java不允许你做任何这样的事情不幸。其他JVM语言虽然可能,即Scala

+0

织补。好,谢谢。我希望自己刚刚患上了新手盲症。 :) – dwwilson66 2012-03-22 19:51:03

这大约是最好的,你会得到:

switch(card){ 
    case1: 
    case2: 
    case3: 
     suit="Hearts"; 
     break; 

某些库提供“范围”功能。它不适用于开关语法,但它应该完成这项工作。例如,Range类别Guava

Range hearts = Ranges.closed(1, 13); 
Range clubs = Ranges.closed(14, 17); 
// ... 

if (hearts.contains(value)) { 
    // case heart... 
} else if (clubs.contains(value) { 
    // case club... 
} // ... 

这是项目硬币在一段时间后提出的。

基本上,开关操作符现在在内置插件和对象上运行。尽管选择两个内置插件时存在明确定义的范围,但在对象上运行的开关没有明确定义的范围。目前支持两类对象,StringsEnum

“A”和“D”之间是“车”吗?取决于你喜欢如何处理大小写敏感。

MyEnum.ONE之前MyEnum.TWO?根据生产代码的不同,这是一个非常糟糕的主意(正如Josh Bloch希望解释的那样),如果您需要排序,可维护的方法是实现非索引界限比较器。如果不强制每个枚举实现一个排序(对于没有排序的枚举都没有意义),这种更好的练习将很难整合到一个简单的开关中。

The project coin proposal is found here

Josh Bloch为什么不依赖于隐式枚举排序is found within the presentation here的精彩演讲。