Использование оператора switch с диапазоном значений в каждом случае?
Можно ли в Java написать оператор switch, где каждый случай содержит более одного значения? Например (хотя ясно, что следующий код не будет работать):
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
?
Ответы
Ответ 1
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");
}
Ответ 2
Наиболее близким к этому типу поведения с операторами 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
.
Ответ 3
другая альтернатива использует математическую операцию, деля ее, например:
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;
}
Но, как вы можете видеть, это можно использовать только тогда, когда диапазон фиксирован в каждом случае.
Ответ 4
Я не думаю, что вы можете сделать это на 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:
//
}
Ответ 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");
Ответ 6
Нет, вы не можете этого сделать. Лучшее, что вы можете сделать, это то, что
case 1:
case 2:
case 3:
case 4:
case 5:
System.Out.Println("testing case 1 to 5");
break;
Ответ 7
Попробуйте, если вы должны использовать переключатель.
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;
}
}
Ответ 8
Я знаю, что этот пост старый, но я считаю, что этот ответ заслуживает некоторого признания. Нет необходимости избегать оператора switch. Это можно сделать в java, но через оператор switch, а не в случаях. Он включает использование тернарных операторов.
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;
}
}
}
Ответ 9
Можно группировать несколько условий в одном и том же выражении 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;
}
Ответ 10
Или вы можете использовать свои сольные случаи, как предполагалось, и использовать свой случай по умолчанию, чтобы указать инструкции диапазона:
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;
}
Ответ 11
Вы можете использовать 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;
}
}
Ответ 12
Используйте реализацию 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);
Ответ 13
Ответ @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");
Ответ 14
Вот красивый и минималистский способ пойти
(num > 1 && num < 5) ? first_case_method()
: System.out.println("testing case 1 to 5")
: (num > 5 && num < 7) ? System.out.println("testing case 1 to 5")
: (num > 7 && num < 8) ? System.out.println("testing case 1 to 5")
: (num > 8 && num < 9) ? System.out.println("testing case 1 to 5")
: ...
: System.out.println("default");
Ответ 15
Что касается 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);
}
Вы должны быть в состоянии реализовать это и для целых.
Ответ 16
Для входного номера в диапазоне 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);
Ответ 17
Этот тип поведения не поддерживается в Java. Однако, если у вас есть большой проект, который нуждается в этом, рассмотрите возможность смешивания кода Groovy в вашем проекте. Groovy-код компилируется в байт-код и может быть запущен с помощью JVM. Компания, в которой я работаю, использует Groovy для написания классов обслуживания и Java для написания всего остального.