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

时间:2012-03-22 19:48:46

标签: java switch-statement

我正在尝试简化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教程中找到任何表明存在开关变化的内容。但是有吗?

5 个答案:

答案 0 :(得分:8)

关于你能做的最好的事情是这样的(见下文)。所以在某些情况下(没有双关语:)),最好使用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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

基本上,交换机操作员现在可以在内置和对象上操作。虽然存在用于选择两个内置函数的明确定义的范围,但是在对象上操作的开关没有明确定义的范围。目前支持两类对象StringsEnum

“A”和“D”之间的“车”?取决于您希望如何处理区分大小写。

MyEnum.ONE之前MyEnum.TWO?在生产代码中取决于它是一个非常糟糕的想法(正如Josh Bloch希望解释的那样),如果需要排序,可维护的方法是实现非索引绑定比较器。这种更好的实践很难集成到一个简单的开关中,而不会强制每个枚举实现一个排序(对于没有排序的枚举没有意义)。

The project coin proposal is found here

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

答案 3 :(得分:0)

这是你将获得的最好成绩:

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

答案 4 :(得分:0)

某些库提供“范围”功能。它不适用于switch语法,但它应该可以完成这项工作。

例如,RangeGuava类。

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...
} // ...