2012-03-22 69 views
4

我試圖簡化一個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

回答

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 
+2

Map ...另一個有趣的功能超出了我的新手...我有一個週末的研究項目或兩個。 :) 謝謝。 – dwwilson66 2012-03-23 19:36:18

3

Java不允許你做任何這樣的事情不幸。其他JVM語言雖然可能,即Scala

+0

織補。好,謝謝。我希望自己剛剛患上了新手盲症。 :) – dwwilson66 2012-03-22 19:51:03

0

這大約是最好的,你會得到:

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

某些庫提供「範圍」功能。它不適用於開關語法,但它應該完成這項工作。例如,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... 
} // ... 
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的精彩演講。

相關問題