sco0ter: Comparer Klassen. ArrayList nach 2 Kriterien sortieren

Hi,

ich arbeite in ASP.NET und habe ein Array, welches Objekte beinhaltet, die jeweils zwei Eigenschaften haben, ein Label und einen boolschen Wert.

Ich möchte das Array nun nach beiden Kriterien (die Eigenschaften) sortieren.

Alle Objekte die den boolschen Wert auf TRUE haben, sollen zuerst kommen, danach die, die auf FALSE sind.

Es gibt also 2 Grupppen innerhalb des Arrays.

Jede Gruppe soll in sich noch mal alphabetisch an Hand des Labels sortiert werden.

Ich habe die Schnittstelle IComparable implementiert und nun muss ich obiges Problem nur noch der Methode CompareTo(x) beibringen.

Aber irgendwie erscheint mir das nicht ganz möglich, da ich entweder nur alphabetisch oder nach den boolschen Werte sortieren kann. Aber beides geht schlecht.

Das ganze soll dazu dienen um Dateiinformationen zu sortieren. Boolscher Wert ist hier: Verzeichnis oder Datei?
Label ist hier: Datei/Verzeichnisname

Verzeichnisse sollen am Anfang stehen, und in sich nochmal sortiert sein (alphabetisch). Dasselbe dann für die Dateien.

Ausgangspunkt ist halt ein wildverwürfeltes Array.

Hat jemand eine Idee?

MfG!

  1. Hi !

    Alle Objekte die den boolschen Wert auf TRUE haben, sollen zuerst kommen, danach die, die auf FALSE sind.

    OK

    1.) Sortiere das Ausgangsarray nach booleschem Wert
    2.) Kopiere den Teil des Arrays, der TRUE hat in ein anderes Array und sortiere dieses alphabetisch
    3.) Kopiere dieses Array wieder in das Ausgangsarray an die Stelle, an der die TRUE-Objekte sind
    4.) Verfahre mit FALSE wie bei Schritt 2.) und 3.)

    Gruß

    Hans

    1. Hm,

      zu simple... :-/

      Vielen Danke hat geklappt!

      MfG!

      Hi !

      Alle Objekte die den boolschen Wert auf TRUE haben, sollen zuerst kommen, danach die, die auf FALSE sind.

      OK

      1.) Sortiere das Ausgangsarray nach booleschem Wert
      2.) Kopiere den Teil des Arrays, der TRUE hat in ein anderes Array und sortiere dieses alphabetisch
      3.) Kopiere dieses Array wieder in das Ausgangsarray an die Stelle, an der die TRUE-Objekte sind
      4.) Verfahre mit FALSE wie bei Schritt 2.) und 3.)

      Gruß

      Hans

  2. Hallo sco0ter,

    Wenn Du einen stabilen Sortieralgorithmus, d.h. einen, der die Reiehenfolge gleicher Elemente nicht ändert, verwendest, kannst Du Deinen Array einfach zweimal mit verschiedenen kriterien sortieren.
    Der Standardalgorithmus bei Java erfüllt dieses Kriterium, das macht es wahrscheinlich, dass es der bei .NET auch tut ;-)

    Ich habe die Schnittstelle IComparable implementiert und nun muss ich obiges Problem nur noch der Methode CompareTo(x) beibringen.

    Die oben aufgezeigte Lösung klappt natürlich nicht mit dieser Schnittstelle, da müsste man einen Comparator verwenden. Das Interface heißt dann vermutlich IComparator...

    Es ist aber natürlich problemlos möglich, einen Vergleich mit mehreren Kriterien zu definieren:
    Seien compareTo1(x) und cpmpareTo2(x) die Vergleiche nach je einem Kriterium:

    int comparTo(x) {
      int result = compareTo1(x);
      if (result == 0) {
        result = compareTo2(x);
      }
      return result;
    }

    Noch als Anmerkung: Nach boolschen Werten kann man natürlich schneller sortieren, indem man die Elemente in zwei Arrays trennt oder vorher bestimmt, wie viel Elemente mit true und mit false vorkommen und dann ausrechnen kann, in welchen Teil des Arrays ein Element muss.

    Grüße

    Daniel

  3. Hoi,

    also compareTo soll doch eigentlich nur 2 Dinge vergleichen und dann einen entsprechenden int-Wert ausspucken anhand dessen sort() dann diese Dinge sortieren kann.

    Ansich sollte dein Problem doch recht einfach so gelößt werden (Pseudo Code)
    compareTo(obj1, obj2):
      if obj1.bool != obj2.bool:
         if obj1.bool == 'True':
            return -1
         else:
            return 1
      else:
         return cmp(obj1.label, obj2.label)

    Wobei cmp ein String Vergleich sein sollte, der eigentlich in den meisten Programmiersprachen bereits vorhanden ist.

    Damit sollte die Funktion compareTo genau das liefern, was du möchtest.

    Gruß Ben