Gibt es ein Algorithmus um if else if Anweisungen in Java in switch case zu überführen?
3 Antworten
Brauchst Java bei Switch/Case nicht auch exaktes Matching?
Wie würde man also Ranges zu einem Switch/Case überführen wollen?
Das scheint mir mitunter wenig zielführend zu sein.
Wenn man bedenkt, dass Switches viel limitierter sind als normale if-else-Blöcke, dann ja. Switches können nur eine einzige bestimmte Variable mit anderen Variablen vergleichen.
Ich hab dir mal einen Algorithmus programmiert, um ein solches if-else zu einem Switch umzuwandeln:
<textarea placeholder="if-else Code hier..." id="ifelseinput" style="width: 60vw; min-height: 30vh;"></textarea>
<button onclick="convertToSwitch()" style="display: block;">
Umwandeln
</button>
<textarea id="output" style="width: 60vw; min-height: 30vh; display: block;"></textarea>
<script>
function convertToSwitch() {
const output = document.getElementById("output");
output.innerHTML = "";
const expression = document.getElementById("ifelseinput").value;
const ifs = [...expression.matchAll(/if *\( *(\S+) *(==|\.equals\() *([^)\s]+)\)+ *{ *\n*\r*\t*( *[^{}]+|\n+)}/g)];
output.innerHTML += `switch(${ifs[0][1]}) {\n`;
for (const match of ifs) {
output.innerHTML += ` case ${match[3]}:\n${match[4].split("\n").map(x => " "+x.trim()).join("\n")}break;\n`;
}
output.innerHTML += "}";
}
</script>
Hier kannst du es ausprobieren: https://jsfiddle.net/uLtyxmr1/
Einfach in das Textfeld deinen Java if-else-Code einfügen und umwandeln drücken. Unten bekommst du es dann als switch.
Das Element mit dem im if verglichen wird muss darin immer als erstes stehen (wie in den folgenden Beispielen das x).
Der Code funktioniert sowohl für == Vergleiche, als auch für .equals().
Test Cases:
if (x == 1) {
doThis();
doThat();
} else if (x == 2) {
doSomethingElse();
} else if (x == 4) {
theEnd();
}
wird zu
switch(x) {
case 1:
doThis();
doThat();
break;
case 2:
doSomethingElse();
break;
case 4:
theEnd();
break;
}
--
if (x.equals("a")) {
doThis();
doThat();
} else if (x.equals(y)) {
doSomethingElse();
} else if (x.equals("z")) {
theEnd();
}
wird zu
switch(x) {
case "a":
doThis();
doThat();
break;
case y:
doSomethingElse();
break;
case "z":
theEnd();
break;
}
Jo, hab ich getestet, kommt mit Strings und Variablen klar. Sieht man ganz gut am letzten Beispiel.
Hm, seltsam.
Ich hab's grad mal mit
class Test{
public static void main(String[] args){
String x = "foobar";
String y = "baz";
switch(x){
case "fizz":
System.out.println("1");
break;
case y:
System.out.println("2");
break;
case "buzz":
System.out.println("3");
break;
default:
System.out.println("d");
break;
}
}
}
ausprobiert, da gibt mir der Java-Compiler das raus:
Test.java:9: error: constant string expression required
case y:
^
1 error
Zur Vollständigkeit: Ich hab's mit Version 11.0.12 getestet. Könnte evtl. bei bestimmten Versionen anders ausschauen.
Dann ist's aber (streng genommen) keine Variable mehr sondern eine Konstante. ^^
Nein, den kann es auch nicht geben.
Es gibt zwar Anwendungsfälle, in denen eine if-else- und eine switch-case-Struktur gleichermaßen verwendet werden können, aber in den allermeisten Fällen geht das nicht bzw. nicht sinnvoll.
Hast du das Ergebnis getestet?
Wäre recht interessant zu wissen, ob Java tatsächlich mit Strings, noch dazu Variablen in den case-Deklarationen klarkommt.