【问题标题】:Can I use a range of values in a single switch?我可以在单个开关中使用一系列值吗?
【发布时间】:2012-03-22 19:48:45
【问题描述】:

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

【问题讨论】:

  • 对于这种特殊情况,您可以在 (card-1) / 13 上执行 switch 或类似的操作。
  • @LouisWasserman:如果我没看错,int foo = (card-1) / 13; 将产生整数值 1-4,然后可以将其传递给switch。我理解正确吗?
  • 是的。或者类似的东西,这取决于你如何给卡片编号。

标签: java switch-statement


【解决方案1】:

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

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

【讨论】:

  • 该死。好,谢谢。我希望我只是患有新手盲症。 :)
【解决方案3】:

这是不久前在 Project Coin 中提出的。

基本上,switch 运算符现在对内置函数和对象进行操作。虽然存在用于选择两个内置插件的明确定义的范围,但在对象上操作的开关没有明确定义的范围。目前支持两类对象,StringsEnum

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

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

The project coin proposal is found here.

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

【讨论】:

    【解决方案4】:

    这是你将获得的最好的:

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

    【讨论】:

      【解决方案5】:

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

      例如,GuavaRange 类。

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

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 2015-02-09
        • 2013-01-08
        • 1970-01-01
        • 2012-07-25
        相关资源
        最近更新 更多