AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringList CustomSort

Ein Thema von MicMic · begonnen am 10. Sep 2018 · letzter Beitrag vom 16. Sep 2018
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

StringList CustomSort

  Alt 10. Sep 2018, 20:44
Delphi-Version: 10.2 Tokyo
Hallo,

ich habe eine StringList und mit AddObject füge ich ein "Array Of Record" den Items hinzu.
Das geht alles.

Bei manchen Aktionen wird umsortiert, mittels CustomSort. Dabei soll das erste Item samt Object nicht immer umsortiert werden und bei Index 0 bleiben.
Kann man da irgendwie die CustomSort erweitern?
So schaut meine aus:
Code:
Function Sort1(List: TStringList; Index1, Index2: Integer): Integer;
Begin
 Result := 0;
 If Assigned(List) Then
 Begin
  If TMStringList(List).SortUp = 0
  Then Result := -AnsiCompareText(List[Index1],List[Index2])
  Else Result := AnsiCompareText(List[Index1],List[Index2])
 End;
End;
Man könnte auch nach dem sortieren die zuvor Index 0 (die vielleicht nach dem sortieren auf Index 12 steht <- als Beispiel) wieder auf Index 0 verschieben. Aber so etwas wie MoveObject habe ich nicht gefunden. Mit InsertObject kann ich ein Eintrag leicht auf Index 0 einfügen. Das wäre Möglich. Fragt sich dann nur, wie ich (um das Beispiel zu nehmen) Index 12 erst mal herauskopiere, lösche und dann die kopierten Daten wieder einfüge.

Experten kennen bestimmt ne leichte Lösung.

InsertObject nutze ich schon für etwas anderes. Das schaut bei mir so aus.
Code:
MeineStringListe.InsertObject(0,TRecordDaten[12].Text ,@TRecordDaten[12]);
Gruß
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: StringList CustomSort

  Alt 10. Sep 2018, 20:54
Du könntest prüfen, ob Index1 oder Index2 gleich Null sind und dann je nach Index und Sortierreihenfolge immer -1 oder +1 zurückgeben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: StringList CustomSort

  Alt 10. Sep 2018, 21:11
Das mit der Sortierreihenfolge habe ich nicht ganz so verstanden wegen Index 0
Habe aber mal eben meine CustomSort erweitert.
Code:
Function Sort1(List: TStringList; Index1, Index2: Integer): Integer;
Begin
 Result := 0;
 If Assigned(List) Then
 Begin
  If TMStringList(List).SortUp = 0
  Then Result := -AnsiCompareText(List[Index1],List[Index2])
  Else Result := AnsiCompareText(List[Index1],List[Index2])
 End;
 // hinzugefügt
 if Index1 = 0 then Result := -1;
 if Index2 = 0 then Result := +1;
End;
So bleibt der erste Eintrag immer bei Index 0. Wenn das so bleibt, ist's ja super einfach :=) Also mal Dankeschön. Aber ich habe mal etwas probiert. Wenn ich für Index1 = 0 bei Result +1 und bei Index2 = 0 bei Result -1 angebe, gibt's ein Fehler "Listenindex außerhalb des gültigen Bereichs". Aber so wie oben geht es. Würde aber gerne wissen, warum andersrum ein Fehler kommt. Damit ich's halt verstehe mit diesem CustomSort.

Aber nun muss ich ins Bettchen
Aber mal super Dankeschön. Mal wieder einen Schritt weiter und kann nun schön träumen *lach

Michael
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: StringList CustomSort

  Alt 10. Sep 2018, 21:27
Das mit der Sortierreihenfolge habe ich nicht ganz so verstanden wegen Index 0
Achso, ja das war auch Blödsinn So wie du es momentan hast, sollte es schon passen.

Würde aber gerne wissen, warum andersrum ein Fehler kommt.
Puh kann dir so aus dem Kopf grade gar nicht sagen, was mit dem Ergebnis des Vergleichs im Folgenden dann passiert, wenn man Sort() aufruft. Wahrscheinlich wird irgendwie versucht das Element an Index -1 so setzen oder so.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: StringList CustomSort

  Alt 11. Sep 2018, 06:52
Moin...
Muß es eine TStringlist sein? Geht auch TList<string> mit dem entsprechendem Comparer?
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: StringList CustomSort

  Alt 11. Sep 2018, 08:42
Wenn ich für Index1 = 0 bei Result +1 und bei Index2 = 0 bei Result -1 angebe, gibt's ein Fehler "Listenindex außerhalb des gültigen Bereichs". Aber so wie oben geht es. Würde aber gerne wissen, warum andersrum ein Fehler kommt. Damit ich's halt verstehe mit diesem CustomSort.
Deine Sort1-Funktion ist ja nur die Vergleichsfunktion. Der Fehler dürfte aber in der eigentlichen Sortierfunktion geworfen werden, d.h. du müsstest dir diese mal im Konzert mit deiner Funktion anschauen, dann sollte es klar werden, denke ich.
Ralph
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: StringList CustomSort

  Alt 11. Sep 2018, 19:25
Wenn ich für Index1 = 0 bei Result +1 und bei Index2 = 0 bei Result -1 angebe, gibt's ein Fehler "Listenindex außerhalb des gültigen Bereichs". Aber so wie oben geht es. Würde aber gerne wissen, warum andersrum ein Fehler kommt. Damit ich's halt verstehe mit diesem CustomSort.
Deine Sort1-Funktion ist ja nur die Vergleichsfunktion. Der Fehler dürfte aber in der eigentlichen Sortierfunktion geworfen werden, d.h. du müsstest dir diese mal im Konzert mit deiner Funktion anschauen, dann sollte es klar werden, denke ich.
Bei "-AnsiCompareText(List[Index1],List[Index2])" hatte er den Fehler verursacht.

Ich habe jetzt jedenfalls gemerkt, dass in Index2 nie 0 ankommt, wenn zuvor "if Index1=0 then Result := -1;" angegeben wird. Also mit dieser einzigen Zeile scheint es zu gehen. Aber ich verstehe es noch nicht so ganz, da z.B. ein "if Index1=1 then Result := -1;" die Anwendung einfriert (Keine Rückmeldung). Das dürfte doch gar nicht passieren? Es kommt dann wohl mit "AnsiCompareText" in Konflikt. Die Funktion wird ja je nach Inhaltsgröße der StringList mehrmals aufgerufen.

Es geht jedenfalls so:
Code:
Function Sort1(List: TStringList; Index1, Index2: Integer): Integer;
Begin
 Result := 0;
 If Assigned(List) Then
 Begin
  If TMStringList(List).SortUp = 0
  Then Result := -AnsiCompareText(List[Index1],List[Index2])
  Else Result := AnsiCompareText(List[Index1],List[Index2])
 End;
 // hinzugefügt damit der erste Eintrag trotz CustomSort immer oben bleibt
 if Index1 = 0 then Result := -1;
End;
Aber ob's dann immer so passt? Die StringList hat ja nicht immer gleiche Inhalte. Und wie gesagt, prüfe ich "Index1 = 1" anstatt 0, macht die Anwendung Dauer-Urlaub.

@haentschman
Ich müsste wohl viel ändern im Source, wenn ich's in TList umbauen würde
Wollt das mit ner TStringList schon so behalten

Michael
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: StringList CustomSort

  Alt 12. Sep 2018, 12:23
Dann macht es halt der nächste und benötigt doppelt so lange - und ärgert sich dann über Dich.
Das Object zu nehmen war eine Notlösung als es noch keine Generics gab.
(und ich war schon so oft der "nächste)
  Mit Zitat antworten Zitat
Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#9

AW: StringList CustomSort

  Alt 16. Sep 2018, 11:28
Delphi-Quellcode:


Function Sort1(List: TStringList; Index1, Index2: Integer): Integer;
Begin
   Result:=0; //Default Wert

   //========================================================
   //Der der Index 0 hat soll nach oben sortiert werden.
   //========================================================
   If Index1=0 then
   begin
      Result:=-1;
      Exit;
   end;
   If Index2=0 then
   begin
      Result:=1;
      exit;
   end;


   //========================================================
   //Jetzt erst der Vergleich der eigentlichen Daten
   //========================================================
   if AnsiCompareText(List[Index1],List[Index2])>0 then
   begin
      Result:=1;
      Exit;
   end;
   if AnsiCompareText(List[Index1],List[Index2])<0 then
   begin
      Result:=-1;
      Exit;
   end;
end;
Auf diese Weise kann man eine Sortierung nach verschiedenen Kriterien priorisieren.
Ähnlich wie man eine Excel Tabelle in einem Rutsch nach verschiedenen Spalten Sortieren kann.
Deswegen die strukturierte Schreibweise mit den "Exit" Befehlen.

Ich habs jetzt mal aus dem Gedächtnis geschrieben.
Muss man einfach mal debuggen und sehen was drin ist um die Results richtig rum zu setzen.

Die Geschwindigkeit finde ich Ausreichend. Ich sortiere so sehr große Records, in 5 Ebenen (Prioritäten)
Die Liste enthält 20000 Einträge und wird in einem Sekundenbruchteil sortiert.

Geändert von Solutor (16. Sep 2018 um 11:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: StringList CustomSort

  Alt 16. Sep 2018, 12:07
Zitat:
Delphi-Quellcode:
   //========================================================
   //Jetzt erst der Vergleich der eigentlichen Daten
   //========================================================
   if AnsiCompareText(List[Index1],List[Index2])>0 then
   begin
      Result:=1;
      Exit;
   end;
   if AnsiCompareText(List[Index1],List[Index2])<0 then
   begin
      Result:=-1;
      Exit;
   end;
Delphi-Quellcode:
   //========================================================
   //Jetzt erst der Vergleich der eigentlichen Daten
   //========================================================
   Result := AnsiCompareText(List[Index1],List[Index2])

Delphi-Quellcode:
function Sort1(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if Index1 = 0 then // Der der Index 0 hat soll nach oben sortiert werden.
    Result := -1
  else if Index2 = 0 then
    Result := 1
  else
    Result := AnsiCompareText(List[Index1], List[Index2]);
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz