Alternative zu if-else

Conners

Erfahrenes Mitglied
Hi,

ich habe einen HTML-Parser geschrieben, in dem sehr oft string-vergleiche stattfinden. Ich möchte den Code jetzt optimieren und hab mir überlegt statt if else else else else.... eine switch-case Anweisung einzubauen, leider funktioniert diese aber nur, soweit ich das verstanden hab, mit Integers bzw. Enums.

Gibt es noch andere Alternativen?

Bei mir sieht es im Code z.B. oft so aus:

Code:
if (mystring.equals(string2)
else if (mystring.equals(string3)
else if (mystring.equals(string4)
else if (mystring.equals(string5)
else if (mystring.equals(string6)
else if (mystring.equals(string7)
...

Oder kann ich die zu vergleichenden Strings irgendwie als Int´s in nem enum packen?

Gruß
Conners
 
Wenn die Strings völlig dynamisch sind wirds schwer, aber warum wrappst du nicht zumindest die gesuchten Werte in ein Enum? Komplizierte Stringvergleiche sind eigentlich immer ein Anzeichen für mangelnde Abstraktion.

Gruß
Ollie
 
Würd ich gerne machen, was aber wenn meine Strings z.B. so aussehen:

Code:
public enum tags {
        <p>, </p>
}

enums integrieren ja automatisch quotations marks oder?

EDIT:
Und selbst wenn ich die gesuchten Strings in ein enum packen wollte, müsste ich doch beim parsen jedesmal mit if-else rausfinden welcher enum genutzt werden soll oder?
 
Zuletzt bearbeitet:
Ganz allgemein gesprochen würde ich, wenn ich viele viele Strings zu vergleichen habe, und diese womöglich noch dynamaisch sein könnten oder dürften, eine Map verwenden. Das ist zum einen dann keine lineare Suche mehr und verkürzt den Code auch ganz prima.
 
Zuletzt bearbeitet:
Ah zu spät gelesen. Nixdestotrotz soviele Strings sinds bei mir auch nicht. Ich schätz mal so 30 Stück.
Außerdem hab ich keine Ahnung was eine Map ist.

Ich hab jetzt folgendes gemacht:
Ich hab von jedem String den .hashCode() gebildet und in eine Switch(mystring.hashCode()) gelegt.
Als nächstes würd ich das mit nem enum verbinden, damit bei den case-Anweisungen keine Hashes mehr stehen.

Ist das sinnvoll?
 
Tags, geparsed aus HTML-Text. Also am ehesten Werte.
Ich muss lediglich vergleichen.

Ein String sieht z.B. bei mir so aus "&lt;p&gt;", also "<p>" nur so als Beispiel.

Gruß
Conners
 
Zuletzt bearbeitet:
Java:
public enum MyConstants {

  P("<p>"), H1("<h1>"); // Viele andere mehr

  private String text;

  private MyConstants(String text) {
    this.text = text;
  }

  public static MyConstants fromText(String text) {

    if (null == text) {
      return null;
    }

    for (MyConstant that : MyConstant.values()) {
      if (this.text.equals(that.text) {
        return that;
      }
    }

    return null;
  }
}

Dein Client macht dann einfach mit fromText() aus dem String eine MyConstant und dann gehts ab in das switch Statement.

REINHAUN!
 
Ah, das sieht sehr vielversprechend aus.
Ich danke dir Oliver!

edit: 2 Kleinigkeiten zu dem Code. this ist doch eine Art Referenzpointer oder? Also kann man den in statischen Funktionen doch net benutzen oder?
Und kann man null switchen?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück