Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Delphi Listbox Items nach Teil String sortieren

  Alt 24. Dez 2017, 02:40
@Zeref:
Ein Weihnachtsgeschenk für dich:

Delphi-Quellcode:
PROCEDURE SortListBoxBubbleSort(List:TStrings; Dsc:Boolean);
FUNCTION Compare(const A,B:String):Integer;
begin
   Result:=Pos(' ',A)-Pos(' ',B);
   if Result=0 then Result:=CompareStr(A,B);
   if Dsc then Result:=-Result;
end;
var I,First,Last:Integer; Sorted:Boolean; H:String;
begin
   List.BeginUpdate;
   First:=0;
   Last:=List.Count-1;
   repeat
      Dec(Last);
      Sorted:=true;
      for I:=First to Last do
         if Compare(List[I],List[I+1])>0 then begin
            Sorted:=false;
            H:=List[I];
            List[I]:=List[I+1];
            List[I+1]:=H;
         end;
   until Sorted;
   List.EndUpdate;
end;
Aufruf:
SortListBoxBubbleSort(ListBox1.Items,True);

Der zweite Parameter gibt an, ob die Liste aufsteigend (False) oder absteigend sortiert wird (True).

Achtung:
Das funktioniert nur, wenn alle Einträge mit einer vorzeichenlosen Ganzzahl ohne führende 0 beginnen und dieser Zahl ein Blank folgt.
Die Compare Funktion gibt 0 zurück wenn A = B ist, einen positiven Wert wenn A > B ist und einen negativen Wert, wenn A < B ist.


Wenn die Liste nur wenig Einträge hat (200 oder so) dann sollte die obige Version OK sein.
Bei mehr Einträgen hier die Quicksort-Version:

Delphi-Quellcode:
PROCEDURE SortListBoxQuickSort(List:TStrings; Dsc:Boolean);
FUNCTION Compare(const A,B:String):Integer;
begin
   Result:=Pos(' ',A)-Pos(' ',B);
   if Result=0 then Result:=CompareStr(A,B);
   if Dsc then Result:=-Result;
end;
var M,H:String;
PROCEDURE QSort(First,Last:Integer);
var I,J:Integer;
begin
   I:=First;
   J:=Last;
   M:=List[(First+Last) shr 1];
   repeat
      while Compare(List[I],M)<0 do Inc(I);
      while Compare(List[J],M)>0 do Dec(J);
      if I<=J then begin
         H:=List[I];
         List[I]:=List[J];
         List[J]:=H;
         Inc(I);
         Dec(J);
      end;
   until i>j;
   if J>First then QSort(First,J);
   if I<Last then QSort(I,Last);
end;
begin
   List.BeginUpdate;
   QSort(0,List.Count-1);
   List.EndUpdate;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat