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.

PeterKremsner  19.01.2022, 01:30

Java kann das meines wissens nicht. C# könnte es seit Version 7.

1

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;
}
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
Zahhak  19.01.2022, 07:33

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.

0
MrAmazing2  19.01.2022, 14:31
@Zahhak

Jo, hab ich getestet, kommt mit Strings und Variablen klar. Sieht man ganz gut am letzten Beispiel.

0
Zahhak  19.01.2022, 17:17
@MrAmazing2

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.

0
Zahhak  19.01.2022, 19:54
@MrAmazing2

Dann ist's aber (streng genommen) keine Variable mehr sondern eine Konstante. ^^

0

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.