2012-03-22 4 views
4

Я пытаюсь упростить класс карты, и мне интересно, есть ли способ использовать диапазон значений в инструкции switch?Могу ли я использовать диапазон значений в одном коммутаторе?

СЧИТАЮТ:

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

      etc. 

Вместо этого я хотел бы использовать переключатель заявление, например:

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

     etc. 

Я не смог найти что-нибудь в Java Tutorials, что предложить есть такой вариант переключателя. Но есть ли?

+0

Нет, вы не можете ... –

+4

Для этого конкретного случая вы можете сделать 'switch' on' (card-1)/13' или что-то в этом роде. –

+0

@LouisWasserman: Если я прочитал это право, 'int foo = (card-1)/13;' будет выдавать целочисленные значения 1-4, которые затем могут быть переданы 'switch'. Я правильно понимаю это? – dwwilson66

ответ

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

Карта ... еще одна интересная особенность, выходящая за рамки моей новички ... У меня есть проект на выходные или два. :) Благодаря. – dwwilson66

3

К сожалению, Java не позволяет вам делать такие вещи. Другие языки JVM могут, хотя, например, Scala.

+0

Darn. Хорошо, спасибо. Я надеялся, что я просто страдаю от новичка-слепоты. :) – dwwilson66

0

Это о лучшем случае вы собираетесь получить:

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

Некоторые библиотеки предоставляют функцию «Range». Он не будет работать с синтаксисом коммутатора, но он должен выполнять эту работу.

Например, 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

Это предложение было предложено в Project Coin некоторое время назад.

В основном оператор коммутатора теперь работает со встроенными и объектами. Хотя существует определенный диапазон для выбора двух встроенных модулей, коммутаторы, которые работают с объектами, не имеют четко определенного диапазона. В настоящее время поддерживаются два класса объектов: Strings и Enum.

«Автомобиль» между «А» и «D»? Зависит от того, как вам нравится обрабатывать чувствительность к регистру.

MyEnum.ONE до MyEnum.TWO? В зависимости от этого в производственном коде это очень плохая идея (как хотел бы объяснить Джош Блох), и если вам нужен заказ, поддерживаемым способом является внедрение неиндексированного связанного компаратора. Эта гораздо лучшая практика будет трудно интегрировать в простой коммутатор, не заставляя каждое перечисление выполнять заказ (что не имеет смысла для перечислений, которые не упорядочены).

The project coin proposal is found here.

Отличная презентация Джоша Блоха о том, почему не полагаться на неявный порядок перечисления is found within the presentation here.

Смежные вопросы