Могу ли я использовать диапазон значений в одном переключателе? - PullRequest
4 голосов
/ 22 марта 2012

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

CONSIDER:

 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 ]

8 голосов
/ 22 марта 2012

О лучшем, что вы можете сделать, это что-то вроде этого (см. Ниже). Так что в некоторых случаях (без каламбура :)) лучше использовать оператор 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
3 голосов
/ 22 марта 2012

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

1 голос
/ 23 марта 2012

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

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

Является ли "машина" между "A" и "D"? Зависит от того, как вам нравится обрабатывать чувствительность к регистру.

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

Предложение монет проекта можно найти здесь .

Отличная презентация Джоша Блоха о том, почему не следует полагаться на неявное упорядочение перечислений , содержится в презентации здесь .

0 голосов
/ 23 марта 2012

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

Например, Range класс Гуава .

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...
} // ...
0 голосов
/ 22 марта 2012

Это лучшее из того, что вы получите:

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