Di Java, apakah mungkin untuk menulis pernyataan switch di mana setiap case berisi lebih dari satu nilai? Misalnya (meskipun jelas kode berikut tidak akan berfungsi):
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;
}
Saya rasa ini bisa dilakukan di Objective C, apakah ada hal serupa di Java? Atau haruskah saya menggunakan if
, else if
pernyataan saja?
java
if-statement
switch-statement
davidx1
sumber
sumber
if/else
merupakan solusi yang lebih baik.Jawaban:
Java tidak memiliki hal semacam itu. Mengapa tidak melakukan yang berikut ini saja?
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"); }
sumber
Yang paling dekat dengan perilaku semacam itu dengan
switch
pernyataan adalahswitch (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; }
Gunakan
if
pernyataan.sumber
Alternatif lain adalah menggunakan operasi matematika dengan membaginya, misalnya:
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; }
Tapi, seperti yang Anda lihat, ini hanya dapat digunakan ketika kisaran ditetapkan dalam setiap kasus.
sumber
Saya tidak berpikir Anda bisa melakukan itu di Jawa. Taruhan terbaik adalah dengan meletakkan kode di kasus terakhir kisaran.
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: // }
sumber
Saya tahu posting ini sudah tua tapi saya yakin jawaban ini layak mendapat pengakuan. Tidak perlu menghindari pernyataan sakelar. Ini dapat dilakukan di java tetapi melalui pernyataan switch, bukan kasusnya. Ini melibatkan penggunaan operator terner.
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; } } }
sumber
switch ((1 <= num && num <= 5 ) ? "1 .. 5" : ...
dan kemudiancase "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");
sumber
Atau Anda dapat menggunakan kasing solo Anda sebagaimana dimaksud dan menggunakan kasing default Anda untuk menentukan instruksi jangkauan sebagai:
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; }
sumber
Coba ini jika Anda harus menggunakan sakelar.
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; } }
sumber
Tidak, Anda tidak bisa melakukan itu. Hal terbaik yang dapat Anda lakukan adalah itu
case 1: case 2: case 3: case 4: case 5: System.Out.Println("testing case 1 to 5"); break;
sumber
Inilah cara yang indah dan minimalis untuk pergi
(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");
sumber
if..elseif
alternatif yang digunakan dalam kaskade operator terner (condition ? statementIfTrue : statementIfFalse
).Anda dapat mengelompokkan beberapa kondisi dalam
case
pernyataan yang sama menggunakan mekanisme fall through yang diizinkan oleh pernyataan switch, hal ini disebutkan dalam tutorial Java dan ditentukan sepenuhnya di bagian §14.11. Pernyataan switch dari Spesifikasi Bahasa Java .Cuplikan kode berikut diambil dari contoh di tutorial, ini menghitung jumlah hari di setiap bulan (dinomori dari bulan 1 hingga bulan 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; }
Seperti yang Anda lihat, untuk mencakup rentang nilai dalam satu
case
pernyataan, satu-satunya alternatif adalah mencantumkan setiap nilai yang mungkin secara individual, satu demi satu. Sebagai contoh tambahan, berikut ini cara mengimplementasikan pseudocode dalam pertanyaan: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; }
sumber
Anda bisa menggunakan an
enum
untuk mewakili rentang Anda,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; } }
sumber
Ini didukung pada Java 12. Lihat JEP 354 . Tidak ada kemungkinan "jangkauan" di sini, tetapi bisa berguna juga.
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); }
Anda harus bisa mengimplementasikannya di int juga. Perhatikan bahwa pernyataan switch Anda harus lengkap (menggunakan
default
kata kunci, atau menggunakan semua nilai yang mungkin dalam pernyataan kasus).sumber
Jawaban @missingfaktor memang benar tapi agak ribet. Kode lebih bertele-tele (setidaknya untuk interval kontinu) daripada bisa, dan membutuhkan overloads / casts dan / atau parameterization untuk long, float, integer dll
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");
sumber
Num
kelas-tipe Haskell jika Anda ingin memahami poin ini dengan lebih baik.if
s seolah-olah saya secara bertahap menumpahkan subrange yang lebih rendah. Selanjutnya, perhitungan berlebihan bukan masalah sama sekali, tapi perbandingan berlebihan agak mengkhawatirkan: mendapat sederhana untuk membuat perbandingan yang berdekatan tidak sinkron, misalnya setelah beberapa edit:if (isBetween(x, 1, 4)) {...} else if (isBetween(x, 6, 10))
. Bagaimanapun, bukan masalah besar.Real
, bukanNum
).Gunakan
NavigableMap
implementasi, sepertiTreeMap
./* 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);
sumber
if (messages.floorEntry(value)!=null)
jika Anda menggunakan nilai IntegerfloorEntry()
tidak akan pernah kembalinull
(memasukkanInteger.MIN_VALUE
kunci dimaksudkan untuk mencegahnya). Namun, apa pun jenis nilainya, Anda perlu memutuskan cara menangani kunci di luar rentang yang valid.Untuk nomor masukan dalam rentang 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);
sumber
Jenis perilaku ini tidak didukung di Java. Namun, jika Anda memiliki proyek besar yang membutuhkan ini, pertimbangkan untuk menggabungkan kode Groovy dalam proyek Anda. Kode Groovy dikompilasi menjadi kode byte dan dapat dijalankan dengan JVM. Perusahaan tempat saya bekerja menggunakan Groovy untuk menulis kelas layanan dan Java untuk menulis yang lainnya.
sumber