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

Java 我可以在单个开关中使用一系列值吗?,java,switch-statement,Java,Switch Statement,我试图简化一个Card类,想知道是否有任何方法可以在switch语句中使用一系列值 考虑: if((card<14)) suit="Hearts"; else if((card>14)&&(card<27)) suit="Clubs"; etc. 我在Java教程中找不到任何东西表明存在这种开关变体。但是有吗?不幸的是,Java不允许您做任何这样的事情。但是,其他JVM语言可能会这样

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

考虑:

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

             etc.

我在Java教程中找不到任何东西表明存在这种开关变体。但是有吗?

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

这是您将得到的最好的:

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

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

有些库提供“范围”功能。它不会与开关语法一起工作,但它应该可以完成这项工作

例如,类


这是一段时间前硬币计划中提出的

基本上,switch操作符现在对内置和对象进行操作。虽然存在用于选择两个内置项的定义良好的范围,但在对象上操作的开关没有定义良好的范围。目前支持两类对象,
Strings
Enum

“车”在“A”和“D”之间吗?取决于您喜欢如何处理区分大小写的问题

MyEnum.ONE在MyEnum.TWO之前是
MyEnum.ONE
?在生产代码中依赖它是一个非常糟糕的想法(Josh Bloch很乐意解释),如果您需要排序,可维护的方法是实现一个非索引绑定的比较器。如果不强制每个枚举实现排序(这对于未排序的枚举没有意义),那么很难将这种更好的实践集成到一个简单的交换机中


Josh Bloch关于为什么不依赖隐式枚举排序的出色演示。

Darn。好的,谢谢。我希望我只是患上了新手盲症。:)对于这种特殊情况,您可以在
(card-1)/13上执行
开关
,或者类似的操作。@LouisWasserman:如果我读对了,那么,
int foo=(card-1)/13
将产生整数值1-4,然后可将其传递到
开关
。我理解得对吗?是的。或者类似的东西,取决于你对卡片的编号。地图的可能副本…另一个有趣的功能超越了我的新手身份…我有一个或两个周末的研究项目。:)谢谢
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
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...
} // ...