Czy w Javie można napisać instrukcję switch, w której każdy przypadek zawiera więcej niż jedną wartość? Na przykład (chociaż wyraźnie poniższy kod nie zadziała):
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;
}
Myślę, że można to zrobić w Objective C, czy jest coś podobnego w Javie? Czy mam po prostu użyć if
, else if
oświadczenia zamiast?
java
if-statement
switch-statement
davidx1
źródło
źródło
if/else
jest lepszym rozwiązaniem.Odpowiedzi:
Java nie ma nic takiego. Dlaczego po prostu nie wykonać następujących czynności?
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"); }
źródło
Najbliższe tego rodzaju zachowania można uzyskać za pomocą
switch
stwierdzeń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; }
Użyj
if
instrukcji.źródło
Inną alternatywą jest użycie operacji matematycznej przez podzielenie jej, na przykład:
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; }
Ale, jak widać, można tego używać tylko wtedy, gdy zakres jest ustalony w każdym przypadku.
źródło
Myślę, że nie możesz tego zrobić w Javie. Najlepiej jest po prostu umieścić kod w ostatnim przypadku zakresu.
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: // }
źródło
Wiem, że ten post jest stary, ale uważam, że ta odpowiedź zasługuje na uznanie. Nie ma potrzeby unikania instrukcji switch. Można to zrobić w Javie, ale za pomocą instrukcji switch, a nie przypadków. Obejmuje użycie operatorów trójskładnikowych.
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; } } }
źródło
switch ((1 <= num && num <= 5 ) ? "1 .. 5" : ...
A potemcase "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");
źródło
Lub możesz użyć swoich przypadków solo zgodnie z przeznaczeniem i użyć domyślnego przypadku, aby określić instrukcje dotyczące zakresu jako:
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; }
źródło
Spróbuj tego, jeśli musisz użyć przełącznika.
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; } }
źródło
Nie, nie możesz tego zrobić. Najlepsze, co możesz zrobić, to to
case 1: case 2: case 3: case 4: case 5: System.Out.Println("testing case 1 to 5"); break;
źródło
Oto piękna i minimalistyczna droga
(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");
źródło
if..elseif
alternatywa wykorzystująca kaskadowo operator trójskładnikowy (condition ? statementIfTrue : statementIfFalse
).Możliwe jest zgrupowanie kilku warunków w tej samej
case
instrukcji przy użyciu mechanizmu fall through dozwolonego przez instrukcje switch, jest to wspomniane w samouczku Java i szczegółowo opisane w sekcji §14.11. Instrukcja switch z języka Java Specification .Poniższy fragment kodu został zaczerpnięty z przykładu w samouczku, oblicza liczbę dni w każdym miesiącu (numerowane od 1 do 12 miesięcy):
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; }
Jak widać,
case
jedyną alternatywą dla pokrycia zakresu wartości w pojedynczym zestawieniu jest wyszczególnienie każdej z możliwych wartości indywidualnie, jedna po drugiej. Jako dodatkowy przykład, oto jak zaimplementować pseudokod w pytaniu: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; }
źródło
Możesz użyć znaku
enum
do reprezentowania swoich zakresów,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; } }
źródło
Jest obsługiwany od wersji Java 12. Sprawdź JEP 354 . Brak możliwości „zakresu”, ale mogą być też przydatne.
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); }
Powinieneś być w stanie zaimplementować to również na int. Zwróć uwagę, że instrukcja switch musi być wyczerpująca (używając
default
słowa kluczowego lub wszystkich możliwych wartości w instrukcjach case).źródło
Odpowiedź @missingfaktor jest rzeczywiście poprawna, ale nieco przesadzona. Kod jest bardziej rozwlekły (przynajmniej dla ciągłych interwałów) niż mógłby być i wymaga przeciążeń / rzutów i / lub parametryzacji dla long, float, Integer itp.
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");
źródło
Num
klasę typów Haskella, jeśli chcesz lepiej zrozumieć ten punkt.if
tak, jakbym stopniowo wydzielał dolny zakres. Ponadto, zbędne obliczenia nie jest to problem w ogóle, ale zbędny porównanie jest nieco niepokojąca: robi się prostsze, aby sąsiadujące ze sobą porównywać z synchronizacji, na przykład po pewnym EDIT:if (isBetween(x, 1, 4)) {...} else if (isBetween(x, 6, 10))
. Zresztą nic wielkiego.Real
nieNum
).Użyj
NavigableMap
implementacji, na przykładTreeMap
./* 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);
źródło
if (messages.floorEntry(value)!=null)
wartości całkowitejfloorEntry()
nigdy nie powrócinull
(włożenieInteger.MIN_VALUE
klucza ma temu zapobiec). Ale niezależnie od typu wartości, musisz zdecydować, jak obsługiwać klucze spoza prawidłowego zakresu.Dla numeru wejścia z zakresu 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);
źródło
Ten typ zachowania nie jest obsługiwany w języku Java. Jeśli jednak masz duży projekt, który tego potrzebuje, rozważ dodanie kodu Groovy do swojego projektu. Kod Groovy jest kompilowany do kodu bajtowego i może być uruchamiany za pomocą JVM. Firma, dla której pracuję, używa Groovy do pisania klas usług i Javy do pisania wszystkiego innego.
źródło