Можно ли в Java написать оператор switch, в котором каждый case содержит более одного значения? Например (хотя очевидно, что следующий код работать не будет):
switch (num) {
case 1 .. 5:
System.out.println("testing case 1 to 5");
break;
case 6 .. 10:
System.out.println("testing case 6 to 10");
break;
}
Я думаю, это можно сделать в Objective C, есть ли подобное в Java? Или я должен просто использовать if
, else if
заявление вместо этого?
java
if-statement
switch-statement
davidx1
источник
источник
if/else
, это лучшее решение.Ответы:
В Java нет ничего подобного. Почему бы просто не сделать следующее?
public static boolean isBetween(int x, int lower, int upper) { return lower <= x && x <= upper; } if (isBetween(num, 1, 5)) { System.out.println("testing case 1 to 5"); } else if (isBetween(num, 6, 10)) { System.out.println("testing case 6 to 10"); }
источник
Самое близкое к такому поведению с помощью
switch
операторов -switch (num) { case 1: case 2: case 3: case 4: case 5: System.out.println("1 through 5"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("6 through 10"); break; }
Используйте
if
заявления.источник
другая альтернатива - использовать математическую операцию, разделив ее, например:
switch ((int) num/10) { case 1: System.out.println("10-19"); break; case 2: System.out.println("20-29"); break; case 3: System.out.println("30-39"); break; case 4: System.out.println("40-49"); break; default: break; }
Но, как видите, это можно использовать только тогда, когда диапазон фиксирован в каждом случае.
источник
Я не думаю, что это можно сделать на Java. Лучше всего просто поместить код в последний регистр диапазона.
switch (num) { case 1: case 2: case 3: case 4: case 5: System.Out.Println("testing case 1 to 5"); break; case 6: case 7: case 8: case 9: case 10: System.Out.Println("testing case 6 to 10"); break; default: // }
источник
Я знаю, что этот пост старый, но считаю, что этот ответ заслуживает признания. Нет необходимости избегать оператора switch. Это можно сделать в java, но с помощью оператора switch, а не case. Это предполагает использование тернарных операторов.
public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = Integer.parseInt(sc.nextLine()); switch ((1 <= num && num <= 5 ) ? 0 : (6 <= num && num <= 10) ? 1 : 2) { case 0: System.out.println("I'm between one and five inclusive."); break; case 1: System.out.println("I'm between 6 and 10 inclusive."); break; case 2: System.out.println("I'm not between one and five or 6 and 10 inclusive."); break; } } }
источник
switch ((1 <= num && num <= 5 ) ? "1 .. 5" : ...
а затемcase "1 .. 5":
.case 1: case 2: case 3: case 4: case 5: System.out.println("testing case 1 to 5"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("testing case 6 to 10"); break; default: System.out.println("default");
источник
Или вы можете использовать свои индивидуальные случаи по назначению и использовать случай по умолчанию, чтобы указать инструкции диапазона как:
switch(n) { case 1 : System.out.println("case 1"); break; case 4 : System.out.println("case 4"); break; case 99 : System.out.println("case 99"); break; default : if (n >= 10 && n <= 15) System.out.println("10-15 range"); else if (n >= 100 && n <= 200) System.out.println("100-200 range"); else System.out.println("Your default case"); break; }
источник
Попробуйте это, если вам нужно использовать переключатель.
public static int range(int num){ if ( 10 < num && num < 20) return 1; if ( 20 <= num && num < 30) return 2; return 3; } public static final int TEN_TWENTY = 1; public static final int TWENTY_THIRTY = 2; public static void main(String[]args){ int a = 110; switch (range(a)){ case TEN_TWENTY: System.out.println("10-20"); break; case TWENTY_THIRTY: System.out.println("20-30"); break; default: break; } }
источник
Нет, ты не можешь этого сделать. Лучшее, что ты можешь сделать, это
case 1: case 2: case 3: case 4: case 5: System.Out.Println("testing case 1 to 5"); break;
источник
Вот красивый и минималистичный способ
(num > 1 && num < 5) ? first_case_method() : System.out.println("testing case 1 to 5") : (num > 5 && num < 7) ? System.out.println("testing case 5 to 7") : (num > 7 && num < 8) ? System.out.println("testing case 7 to 8") : (num > 8 && num < 9) ? System.out.println("testing case 8 to 9") : ... : System.out.println("default");
источник
if..elseif
альтернатива каскадному использованию тернарного оператора (condition ? statementIfTrue : statementIfFalse
).Можно сгруппировать несколько условий в одном
case
операторе, используя механизм пропуска, разрешенный операторами switch, он упоминается в учебнике по Java и полностью описан в разделе §14.11. Заявление о переключателе в спецификации языка Java .Следующий фрагмент кода был взят из примера в руководстве, он вычисляет количество дней в каждом месяце (пронумерованных от месяца 1 до месяца 12):
switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) numDays = 29; else numDays = 28; break; default: System.out.println("Invalid month."); break; }
Как видите, для охвата диапазона значений одним
case
оператором единственной альтернативой является перечисление каждого из возможных значений по отдельности, одно за другим. В качестве дополнительного примера, вот как реализовать псевдокод в вопросе:switch(num) { case 1: case 2: case 3: case 4: case 5: System.out.println("testing case 1 to 5"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("testing case 6 to 10"); break; }
источник
Вы можете использовать
enum
для представления своих диапазонов,public static enum IntRange { ONE_TO_FIVE, SIX_TO_TEN; public boolean isInRange(int v) { switch (this) { case ONE_TO_FIVE: return (v >= 1 && v <= 5); case SIX_TO_TEN: return (v >= 6 && v <= 10); } return false; } public static IntRange getValue(int v) { if (v >= 1 && v <= 5) { return ONE_TO_FIVE; } else if (v >= 6 && v <= 10) { return SIX_TO_TEN; } return null; } }
источник
Он поддерживается начиная с Java 12. Ознакомьтесь с JEP 354 . Здесь нет возможности "диапазона", но тоже может быть полезно.
switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);//number of letters case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); }
Вы также должны иметь возможность реализовать это в ints. Обратите внимание, что ваш оператор switch должен быть исчерпывающим (с использованием
default
ключевого слова или с использованием всех возможных значений в операторах case).источник
Ответ @missingfaktor действительно правильный, но немного сложный. Код более подробный (по крайней мере, для непрерывных интервалов), чем мог бы быть, и требует перегрузок / приведений и / или параметризации для long, float, Integer и т. Д.
if (num < 1) System.Out.Println("invalid case: " + num); // you should verify that anyway else if (num <= 5) System.Out.Println("1 to 5"); else if (num <= 10) System.Out.Println("6 to 10"); else if (num <= 42) System.Out.Println("11 to 42"); else System.Out.Println("43 to +infinity");
источник
Num
класс типов Haskell, если хотите лучше понять этот момент.if
s так, как будто я постепенно избавляюсь от нижнего поддиапазона. Кроме того, избыточные вычисления не проблема вообще, но лишнее сравнение немного беспокоит: он становится проще сделать примыкающие сравнения из синхронизации, например , после некоторого редактирования:if (isBetween(x, 1, 4)) {...} else if (isBetween(x, 6, 10))
. Во всяком случае, ничего страшного.Real
, что нетNum
).Используйте
NavigableMap
реализацию, напримерTreeMap
./* Setup */ NavigableMap<Integer, Optional<String>> messages = new TreeMap<>(); messages.put(Integer.MIN_VALUE, Optional.empty()); messages.put(1, Optional.of("testing case 1 to 5")); messages.put(6, Optional.of("testing case 6 to 10")); messages.put(11, Optional.empty()); /* Use */ messages.floorEntry(3).getValue().ifPresent(System.out::println);
источник
if (messages.floorEntry(value)!=null)
если вы используете целочисленное значениеfloorEntry()
никогда не вернетсяnull
(вставкаInteger.MIN_VALUE
ключа предназначена для предотвращения этого). Но, независимо от типа вашего значения, вам нужно решить, как обрабатывать ключи за пределами допустимого диапазона.Для номера входа в диапазоне 0..100
int n1 = 75; // input value String res; int n=0; int[] a ={0,20,35,55,70,85,101}; for(; n1>=a[n]; n++); switch(6-n+1) { case 1: res="A"; break; case 2: res="B"; break; case 3: res="C"; break; case 4: res="D"; break; case 5: res="E"; break; default:res="F"; } System.out.println(res);
источник
Этот тип поведения не поддерживается в Java. Однако, если у вас есть большой проект, которому это необходимо, подумайте о добавлении кода Groovy в свой проект. Код Groovy компилируется в байтовый код и может запускаться с JVM. Компания, в которой я работаю, использует Groovy для написания классов обслуживания и Java для написания всего остального.
источник