StringList absteigend sortieren (CustomSort)



  • Hallo,

    wenn ich das richtig sehe kann die TStringlist nur aufsteigend sortieren. Welche Möglichkeit habe ich denn die Liste abwärts zu sortieren? Muss man das selber programmieren?



  • Wenn du's dir einfach machen willst, erstell halt eine zweite StringList, geh die erste (sortierte) Liste rückwärts mit einer for-schleife durch und bring das Element der ersten Liste an das Ende der zweiten (per Add()).
    Diese Lösung ist aber weder schön, noch elegant oder schnell. Eigentlich ist sie sogar unter aller Sau, aber dafür schön einfach 😉



  • Das mit der zweiten Liste ist doch gar keine schlechte Idee. Also ich weiss jetzt nicht warum das nicht schön oder elegant sein soll. Das ist doch bestimmt sicherer und schneller als wenn man sich selber was bastelt.



  • Nö, weil man nichts selber basteln muss. Zumindest nicht seit dem BCB5, denn ab da gibt es TStringList::CustomSort. Damit kann man nach Belieben sortieren, natürlich auch rückwärts:

    // Callback-Funktion, die das eigentliche Sortieren übernimmt
    int __fastcall SortBackwards(TStringList *list, int Item1, int Item2)
    {
      // das Minus sorgt dafür, dass das Vergleichsergebnis umgekehrt wird
      return -CompareText(list->Strings[Item1], list->Strings[Item2]);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TStringList *list = new TStringList();
      list->CommaText = "3,6,2,8,1,2,9";
      list->CustomSort(SortBackwards); // Aufruf der Callback-Funktion 
      Memo1->Lines = list;
      delete list;
    }
    //---------------------------------------------------------------------------
    

    Anzumerken ist noch, dass die Callback-Funktion nicht als Klassenmethode (zB. der Form) deklariert werden darf.

    [ Dieser Beitrag wurde am 07.12.2002 um 09:40 Uhr von Jansen editiert. ]


Anmelden zum Antworten