Ist es in Java möglich, eine switch-Anweisung zu schreiben, bei der jeder Fall mehr als einen Wert enthält? Zum Beispiel (obwohl der folgende Code eindeutig nicht funktioniert):
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;
}
Ich denke, dass dies in Ziel C möglich ist. Gibt es eine ähnliche Sache in Java? Oder sollte ich nur if
, else if
Aussagen statt?
java
if-statement
switch-statement
davidx1
quelle
quelle
Antworten:
Java hat nichts dergleichen. Warum nicht einfach folgendes tun?
quelle
Mit
switch
Aussagen kann man dieser Art von Verhalten am nächsten kommenVerwenden Sie
if
Anweisungen.quelle
Eine andere Alternative ist die Verwendung der mathematischen Operation durch Teilen, zum Beispiel:
Wie Sie sehen, kann dies jedoch nur verwendet werden, wenn der Bereich jeweils festgelegt ist.
quelle
Ich glaube nicht, dass Sie das in Java tun können. Am besten setzen Sie den Code einfach in den letzten Fall des Bereichs.
quelle
Ich weiß, dass dieser Beitrag alt ist, aber ich glaube, dass diese Antwort eine gewisse Anerkennung verdient. Die switch-Anweisung muss nicht vermieden werden. Dies kann in Java erfolgen, jedoch über die switch-Anweisung, nicht über die Fälle. Dabei werden ternäre Operatoren verwendet.
quelle
switch ((1 <= num && num <= 5 ) ? "1 .. 5" : ...
und danncase "1 .. 5":
.quelle
Versuchen Sie dies, wenn Sie den Schalter verwenden müssen.
quelle
Oder Sie können Ihre Solofälle wie beabsichtigt verwenden und Ihren Standardfall verwenden, um Bereichsanweisungen wie folgt anzugeben:
quelle
Nein, das kannst du nicht. Das Beste, was Sie tun können, ist das
quelle
Es ist möglich, mehrere Bedingungen in derselben
case
Anweisung zu gruppieren, indem der durch switch-Anweisungen zulässige Fall-Through- Mechanismus verwendet wird. Dies wird im Java-Lernprogramm erwähnt und in Abschnitt §14.11 vollständig angegeben . Die switch-Anweisung der Java-Sprachspezifikation .Der folgende Codeausschnitt stammt aus einem Beispiel im Lernprogramm und berechnet die Anzahl der Tage in jedem Monat (nummeriert von Monat 1 bis Monat 12):
Wie Sie sehen, besteht
case
die einzige Alternative zum Abdecken eines Wertebereichs in einer einzelnen Anweisung darin, jeden der möglichen Werte einzeln nacheinander aufzulisten. Als zusätzliches Beispiel erfahren Sie, wie Sie den Pseudocode in der Frage implementieren:quelle
Sie können ein verwenden
enum
, um Ihre Bereiche darzustellen.quelle
Hier ist ein schöner und minimalistischer Weg
quelle
if..elseif
Alternative, bei der der ternäre Operator (condition ? statementIfTrue : statementIfFalse
) in Kaskade verwendet wird .Verwenden Sie eine
NavigableMap
Implementierung wieTreeMap
.quelle
if (messages.floorEntry(value)!=null)
wenn Sie einen ganzzahligen Wert verwendenfloorEntry()
wird niemals zurückkehrennull
(das Einfügen desInteger.MIN_VALUE
Schlüssels soll dies verhindern). Unabhängig von Ihrem Wertetyp müssen Sie jedoch entscheiden, wie Schlüssel außerhalb des gültigen Bereichs behandelt werden sollen.Es wird ab Java 12 unterstützt. Lesen Sie JEP 354 . Keine "Range" -Möglichkeiten hier, kann aber auch nützlich sein.
Sie sollten dies auch auf Ints implementieren können. Beachten Sie, dass Ihre switch-Anweisung vollständig sein muss (mit dem
default
Schlüsselwort oder mit allen möglichen Werten in case-Anweisungen).quelle
Die Antwort von @missingfaktor ist zwar richtig, aber etwas zu kompliziert. Code ist ausführlicher (zumindest für kontinuierliche Intervalle) als er sein könnte und erfordert Überladungen / Casts und / oder Parametrisierung für Long, Float, Integer usw.
quelle
Num
Typklasse erkunden, wenn Sie diesen Punkt besser verstehen möchten.if
ich mich mit kontinuierlichen Intervallen beschäftige, denke ich persönlich gerne an s, als würde ich allmählich den unteren Teilbereich verschütten. Darüber hinaus ist eine redundante Berechnung überhaupt kein Problem, aber ein redundanter Vergleich ist etwas besorgniserregend: Es wird einfacher, benachbarte Vergleiche nicht synchron zu machen, z. B. nach einigen Änderungen :if (isBetween(x, 1, 4)) {...} else if (isBetween(x, 6, 10))
. Jedenfalls keine große Sache.Real
, nichtNum
).Für Eingangsnummer im Bereich 0..100
quelle
Diese Art von Verhalten wird in Java nicht unterstützt. Wenn Sie jedoch ein großes Projekt haben, das dies benötigt, sollten Sie Groovy-Code in Ihr Projekt einblenden. Groovy-Code wird in Byte-Code kompiliert und kann mit JVM ausgeführt werden. Die Firma, für die ich arbeite, verwendet Groovy, um Serviceklassen zu schreiben, und Java, um alles andere zu schreiben.
quelle