Diana: Vergleiche von char-Variabeln

Guten Tag!

Dieser einfache Code welcher überprüfen soll ob die Zeichen a oder e in einem String vorkommen ergibt immer eine Fehlermeldung. Kann man denn keine Zeichen vergleichen?

for(int i=0;i<=strText.length()-1;i++){
   if(strText.charAt(i)=='a'||'e') {
 System.out.println(strText.charAt(i));
   }
}

Fehler:
"...operator || cannot be applied to boolean,char if(strText.charAt(i)=='a'||'e') {..."

Diana

  1. Hi,

    Dieser einfache Code welcher überprüfen soll ob die Zeichen a oder e in einem String vorkommen

    derartige Vereinfachungen gehen in fast keiner Programmiersprache.

    if(strText.charAt(i)=='a'||'e') {

    Dies sind zwei Prüfungen, die Oder-verknüpft werden. Die erste lautet "strText.charAt(i)=='a'", die zweite "'e'".

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Du hast recht! Könnte sein dass dies in VB funktioniert?!

      1. Hi,

        Könnte sein dass dies in VB funktioniert?!

        keine Ahnung, ich kann kein VB.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Diana,

    Du kannst Dein Programm entweder wie von Cheata vorgeschlagen verbessern, oder reguläre Ausdrücke verwenden. Da kannst Du natürlich so etwas machen:

    if(my_string.matches("a|b")) {
      //mach was
    }

    Grüße

    Daniel

    1. Hi,

      Du kannst Dein Programm entweder wie von Cheata vorgeschlagen verbessern, oder reguläre Ausdrücke verwenden.

      gerade bei der Einfachheit der Vergleiche - und da sich diese zudem innerhalb einer Schleife befinden - wäre das ein völlig unnötiger Performanceverlust. Im Prinzip hast Du natürlich Recht; man sollte RegExp aber immer mit Bedacht einsetzen.

      Cheatah

      --
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hallo Cheatah,

        gerade bei der Einfachheit der Vergleiche - und da sich diese zudem innerhalb einer Schleife befinden - wäre das ein völlig unnötiger Performanceverlust. Im Prinzip hast Du natürlich Recht; man sollte RegExp aber immer mit Bedacht einsetzen.

        Klar natürlich ist das minimal langsamer. Aber in den meisten Fällen dürfte das belanglos sein. Wenn man das nicht nur einmal macht, kann man den RegExp auch erst kompilieren und dann anwenden. Vermutlich ist der unterschied dann nahezu vernachlässigbar.

        Grüße

        Daniel

        1. Hi,

          Klar natürlich ist das minimal langsamer.

          wenn Du "minimal" durch "spürbar" ersetzt, stimme ich Dir zu.

          Aber in den meisten Fällen dürfte das belanglos sein.

          Das kommt darauf an, welche Fälle bei Dir meistens vorliegen. In vielen Fällen ist es ziemlich sinnvoll, eine einfache Regular Expression durch mehrere Codezeilen zu ersetzen.

          Wenn man das nicht nur einmal macht, kann man den RegExp auch erst kompilieren und dann anwenden. Vermutlich ist der unterschied dann nahezu vernachlässigbar.

          Leider nicht. Kleiner Tipp: Die sehr gerne angewendete Trim-RegExp /^\s|\s$/ wird um einiges effizienter, wenn man sie am Oder-Zeichen auftrennt und zwei daraus macht. Du siehst, man kann es richtig machen - und sehr leicht falsch.

          Cheatah

          --
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Hallo Cheatah,

            wenn Du "minimal" durch "spürbar" ersetzt, stimme ich Dir zu.

            Ich habe das jetzt mal ausprobiert und zu meiner überraschung festgestellt, dass Du ausgerechnet bei kurzen, aber nicht bei längeren Strings recht hast.

            Beispiel:

            import java.util.regex.*;

            import java.util.regex.*;

            public class test {
              public static void main(String[] args) {
                String test = "qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz a qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz";
                int limit = 1000000;
                long time = System.currentTimeMillis();
                char c;
                for(int a = 0; a < limit; ++a) {
                  for(int b = 0; b < test.length(); ++b) {
                    c = test.charAt(b);
                    if(c == 'a' || c == 'b') {
                      break;
                    }
                  }
                }
                System.out.println(System.currentTimeMillis() - time);
                time = System.currentTimeMillis();
                Pattern pattern = Pattern.compile("a|b");
                for(int a = 0; a < limit; ++a) {
                  if(pattern.matcher(test).matches()) {

            }
                }
                System.out.println(System.currentTimeMillis() - time);
              }
            }

            Die Variante mit vorkompiliertem RegExp ist doppelt so schnell, wie die Variante mit Schleife. Die RegExp Variante lässt sich sogar noch weiter optimieren, indem man nicht jedes mal einen neuen Matcher erzeugt. Das war aber so schnell, dass ich mir nicht sicher war, ob das Ergebniss nicht gecacht wird.

            Wenn man einen String nimmt, der sehr kurz ist (10 Zeichen oder so) ist die Schleifenvariante allerdings deutlich schneller.

            Vermutlich gibt es eine Möglichkeit die Zeichen schneller hintereinander zu verarbeiten als mit dem Zugriff per charAt().

            Grüße

            Daniel

  3. hallo,

    for(int i=0;i<=strText.length()-1;i++){

    ich würde statt "i <= strText.length()-1" "i < strText.length()" verwenden, weil die zweite variante das gleiche ausdrückt, aber schneller arbeitet, obwohl meines wissens die java-compiler mittlerweile schon so ausgereift sind, dass sie solche "feinheiten" automatisch verbessern.

    mit freundlichen grüßen
       dimitri rettig

    1. Guude!

      for(int i=0;i<=strText.length()-1;i++){

      ich würde statt "i <= strText.length()-1" "i < strText.length()" verwenden, weil die zweite variante das gleiche ausdrückt, aber schneller arbeitet

      Wenn Du weiter die Geschwindigkeit verbessern willst:

      for(int i=0, n=strText.length(); i<n; i++) {...}

      Zwar ist der Geschwindigkeitsvorteil bei solch einfachen Methoden wie length() oder bei Berechnungen wie [int] - 1 kaum mess- und erst recht nicht spürbar, aber so wird length() nur einmal (beim Start der for-Schleife) aufgerufen und nicht nach jedem Durchgang zur Prüfung der Abbruchbedingung.

      obwohl meines wissens die java-compiler mittlerweile schon so ausgereift sind, dass sie solche "feinheiten" automatisch verbessern.

      Nein, Suns JDK 1.4.2 jedenfalls verbessert da nichts.

      LG ausm Hesseland
      Lemmy

      --
      Wer seiner Frau gegenüber stets beteuert, dass DAS tatsächlich 30cm sind, darf sich nicht wundern, wenn sie nicht richtig einparken kann...