SringList sortiert merkwürdig
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
SringList sortiert merkwürdig
Hallo zusammen!
Ich habe ein Verständnisproblem bei der Sortierung in einer Stringliste. Ich lese Daten aus einer SQLite-Tabelle (UTF8) in eine Stringliste ein. Sorted ist TRUE. Dabei bekomme ich eine merkwürdige Sortierung:
1
5
Ärger
Aal
Aaron
Ökonom
Öl
Berta
Cäsar
...
...
Zeppelin.
Wenn ich die selben Daten in eine sortierte List~ / Combobox einlese, ist die Sortierung korrekt. Hat jemand eine Ahnung woran das liegt / liegen könnte? Hintergrund ist, daß die Daten sortiert in einer PickList anzeigen möchte und ich dort keine Möglichkeit zur Sortierung gefunden habe.
Zum Einsatz kommen Lazarus 1.4.0 und FPC 2.6.4 auf Win7 und Win10.
Grüße und vielen Dank im Vorraus
André
Ich habe ein Verständnisproblem bei der Sortierung in einer Stringliste. Ich lese Daten aus einer SQLite-Tabelle (UTF8) in eine Stringliste ein. Sorted ist TRUE. Dabei bekomme ich eine merkwürdige Sortierung:
1
5
Ärger
Aal
Aaron
Ökonom
Öl
Berta
Cäsar
...
...
Zeppelin.
Wenn ich die selben Daten in eine sortierte List~ / Combobox einlese, ist die Sortierung korrekt. Hat jemand eine Ahnung woran das liegt / liegen könnte? Hintergrund ist, daß die Daten sortiert in einer PickList anzeigen möchte und ich dort keine Möglichkeit zur Sortierung gefunden habe.
Zum Einsatz kommen Lazarus 1.4.0 und FPC 2.6.4 auf Win7 und Win10.
Grüße und vielen Dank im Vorraus
André
-
- Beiträge: 6904
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: SringList sortiert merkwürdig
Wen ich folgendes mache, kommt es bei mir anders als bei dir:
Doppelte Werte werden gelöscht.
Ich verwende FPC 3.1.1, vielleicht ligt es an dem.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Sorted:=True;
sl.Add('a');
sl.Add('b');
sl.Add('c');
sl.Add('ä');
sl.Add('ö');
sl.Add('ü');
sl.Add('u');
sl.Add('a');
sl.Add('1');
sl.Add('5');
sl.Add('Ärrger');
sl.Add('Aal');
sl.Add('Aaron');
sl.Add('Ökonom');
sl.Add('Öl');
sl.Add('Berta');
sl.Add('Cäsar');
sl.Add('...');
sl.Add('...');
sl.Add('Zeppelin.');
sl.Add('sl.Sort;');
// sl.Sort;
Memo1.Text := sl.Text;
sl.Free;
end;
Code: Alles auswählen
...
1
5
a
ä
Aal
Aaron
Ärger
b
Berta
c
Cäsar
ö
Ökonom
Öl
sl.Sort;
u
ü
Zeppelin.
Ich verwende FPC 3.1.1, vielleicht ligt es an dem.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: SringList sortiert merkwürdig
Hallo!
sl : TStringList;
(...)
sl := TStringList.create;
sl. Sorted := false; // !!!
(* Daten einlesen ... *)
sl.Sorted := true; // Bei großen Datenmengen und schlappem Rechner: warten ...
Das war schon in Delphi (1, 2, 3 ....) schlecht dokumentiert.
Grüße
Winni
sl : TStringList;
(...)
sl := TStringList.create;
sl. Sorted := false; // !!!
(* Daten einlesen ... *)
sl.Sorted := true; // Bei großen Datenmengen und schlappem Rechner: warten ...
Das war schon in Delphi (1, 2, 3 ....) schlecht dokumentiert.
Grüße
Winni
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: SringList sortiert merkwürdig
Warum sollte man denn die Sortierung ausschalten? TStringList führt beim Anfügen (Add) eine binäre Suche aus um die Zielposition zu finden; daher bleibt die Sortierung erhalten. Fachlich wäre das also vollkommen in Ordnung.Winni hat geschrieben:sl := TStringList.create;
sl.Sorted := false; // !!!
[...]
Das war schon in Delphi (1, 2, 3 ....) schlecht dokumentiert.
Dass ein Quicksort am Ende schneller sein kann als mehrfache binäre Suchen liegt einigermaßen klar auf der Hand.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: SringList sortiert merkwürdig
Hallo!
Ganz einfach: weil die frühen Delphi- und auch die frühen Lazarus-Versionen sich einen Dreck darum gekümmert haben, wie Boolean Sorted beim TSringlist.add stand - sie haben immer hinten angefügt. .Erst das Umstellen von Sorted von false auf true erbrachte die Sortierung.
Vom derzeitigen Stand hab ich keine Ahnung. Jedenfalls funktioniert meine Lösung - und darum ging's ja wohl.
Grüße
Winni
Ganz einfach: weil die frühen Delphi- und auch die frühen Lazarus-Versionen sich einen Dreck darum gekümmert haben, wie Boolean Sorted beim TSringlist.add stand - sie haben immer hinten angefügt. .Erst das Umstellen von Sorted von false auf true erbrachte die Sortierung.
Vom derzeitigen Stand hab ich keine Ahnung. Jedenfalls funktioniert meine Lösung - und darum ging's ja wohl.
Grüße
Winni
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: SringList sortiert merkwürdig
Bei TStrings ist dies auch immer noch der Stand; TStrings selbst kann gar nicht soriteren und kann das daher nicht beachten. TStringList hingegen schon.Winni hat geschrieben:Ganz einfach: weil die frühen Delphi- und auch die frühen Lazarus-Versionen sich einen Dreck darum gekümmert haben, wie Boolean Sorted beim TSringlist.add stand - sie haben immer hinten angefügt. .Erst das Umstellen von Sorted von false auf true erbrachte die Sortierung.
Daher kann es Unterschiede geben, wenn man die Strings zuerst in ein TStringList einliest oder direkt bei der Komponente anhängt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
Re: SringList sortiert merkwürdig
Hallo zusammen!
Erstmal viele Dank für eure Antworten. Ich habe den Tip von Winni, Sorted:= FALSE-Daten einlesen-Sorted := TRUE ausprobiert. Es hat sich nicht am Ergebnis geändert. Ich habe mal das Ergebnis als Bild angefügt. Einmal eine ListBox mit Sorted := TRUE, 1 ListBox mit Sortetd := FALSE und ein Memo. Alle drei Komponenten werden aus der selben Stringliste (Sorted := TRUE) gefüttert. Ich habe mal ein Bild mit dem Ergebnis angefügt. Was mich am meisten wundert, ist, daß der über ListBox.Items / Memo.Lines ausgelesene Eintrag bei allen 3 Kompos gleich ist, obwohl die Anzeige sich unterscheidet.
https://www.magentacloud.de/lnk/f4jkLfgn
Grüße
André
Erstmal viele Dank für eure Antworten. Ich habe den Tip von Winni, Sorted:= FALSE-Daten einlesen-Sorted := TRUE ausprobiert. Es hat sich nicht am Ergebnis geändert. Ich habe mal das Ergebnis als Bild angefügt. Einmal eine ListBox mit Sorted := TRUE, 1 ListBox mit Sortetd := FALSE und ein Memo. Alle drei Komponenten werden aus der selben Stringliste (Sorted := TRUE) gefüttert. Ich habe mal ein Bild mit dem Ergebnis angefügt. Was mich am meisten wundert, ist, daß der über ListBox.Items / Memo.Lines ausgelesene Eintrag bei allen 3 Kompos gleich ist, obwohl die Anzeige sich unterscheidet.

https://www.magentacloud.de/lnk/f4jkLfgn
Grüße
André
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
-
- Beiträge: 6904
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: SringList sortiert merkwürdig
Was passiert, wen du folgendes aufrufst ?
Dafür aber weglässt.
Code: Alles auswählen
sl.Sort;
Code: Alles auswählen
sl.Sorted:=True;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
Re: SringList sortiert merkwürdig
Hallo Mathias!
Auch bei deiner Idee, mit sl.Sort anstatt sl.Sorted := TRUE, bleibt das Ergebnis gleich. Es hat leider keine Auswirkung. Ich frage mich, wo der Unterschied in der Anzeige-Sortierung der Listbox1 und der Sortierung der eigentlichen Liste liegt. Denn die Abfrage der Items führt ja zu einem Ergebnis, das eindeutig von der Anzeige abweicht:
Danach bringen ja alle 3 Abfragen das selbe Ergebnis, obwohl der ermittelte Eintrag in der Listbox1 eigentlich erst an 13. Stelle kommt. Bin ich hier über einen Bug gesolpert oder nur zu blöd die Sortiereinstellungen richtig anzuwenden
Grüße André
Auch bei deiner Idee, mit sl.Sort anstatt sl.Sorted := TRUE, bleibt das Ergebnis gleich. Es hat leider keine Auswirkung. Ich frage mich, wo der Unterschied in der Anzeige-Sortierung der Listbox1 und der Sortierung der eigentlichen Liste liegt. Denn die Abfrage der Items führt ja zu einem Ergebnis, das eindeutig von der Anzeige abweicht:
Code: Alles auswählen
procedure TForm4.FormCreate(Sender: TObject);
begin
slZutat.Sort;
ListBox1.Items := slZutat;
ListBox2.Items := slZutat;
Memo1.Text := slZutat.Text;
Label4.Caption := Label4.Caption + ListBox1.Items.Strings[4];
Label5.Caption := Label5.Caption + ListBox2.Items.Strings[4];
Label6.Caption := Label6.Caption + Memo1.Lines[4];
end;

Grüße André
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
-
- Beiträge: 6904
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: SringList sortiert merkwürdig
Wieso sollten die verschiedene Ergebnisse haben ?Danach bringen ja alle 3 Abfragen das selbe Ergebnis,
Du lädst hier alle 3 Elemente mit dem gleichen slZutat.
Code: Alles auswählen
ListBox1.Items := slZutat;
ListBox2.Items := slZutat;
Memo1.Text := slZutat.Text;
Code: Alles auswählen
sl.Sorted := TRUE,
Mit
Code: Alles auswählen
sl.Sort
Oder verstehe ich deine Frage falsch ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 18
- Registriert: Fr 8. Mär 2013, 16:07
- OS, Lazarus, FPC: MINT 21, Laz: 2.2.0, FPC: 3.2.2
- CPU-Target: x64
- Wohnort: Hzgt. Lauenburg
Re: SringList sortiert merkwürdig
Hallo Mathias!
Ich hatte beim vorletzten Post einen Screenshot angehängt. Danach ist die Anzeige der Listbox1 (Sorted := TRUE) eine andere, als bei der Listbox2 (Sorted := FALSE). Der Eintrag "Äpfel, säuerlich" wird in der Listbox1 an 13. Stelle angezeigt, bei der Listbox2 an 4. die Abbfrage mit Listbox.Items.Strings[4] ergibt aber bei beiden Boxen das selbe Ergebnis.
Aber das eigentliche Problem habe ich leider immer noch nicht lösen können. Es ist egal, ob ich sl.Sort od. sl.Sorted := TRUE verwende, bekomme ich keine ordentlich Sortierung hin. Könnte das mit der Codierung UTF8 zusammenhängen, sprich müßte ich zunächst UTF8ToSys --> sortieren --> SysToUTF8 einsetzen???
Grüße André
Ich hatte beim vorletzten Post einen Screenshot angehängt. Danach ist die Anzeige der Listbox1 (Sorted := TRUE) eine andere, als bei der Listbox2 (Sorted := FALSE). Der Eintrag "Äpfel, säuerlich" wird in der Listbox1 an 13. Stelle angezeigt, bei der Listbox2 an 4. die Abbfrage mit Listbox.Items.Strings[4] ergibt aber bei beiden Boxen das selbe Ergebnis.
Aber das eigentliche Problem habe ich leider immer noch nicht lösen können. Es ist egal, ob ich sl.Sort od. sl.Sorted := TRUE verwende, bekomme ich keine ordentlich Sortierung hin. Könnte das mit der Codierung UTF8 zusammenhängen, sprich müßte ich zunächst UTF8ToSys --> sortieren --> SysToUTF8 einsetzen???
Grüße André
Ein Mensch meint gläubig wie ein Kind, dass alle Menschen Menschen sind. (Eugen Roth)
Re: SringList sortiert merkwürdig
Die Frage ist zwar schon etwas älter, da sie noch niemand beantwortet hat und ich aufgrund eines Bugfixes eben in die Source geschaut habe, kann ich eine Antwort auf die Frage geben. Es liegt einfach daran, dass unter Windows eine native StringList (TWin32ListStringList) für die Controls eingesetzt wird.Andrewi hat geschrieben:Wenn ich die selben Daten in eine sortierte List~ / Combobox einlese, ist die Sortierung korrekt. Hat jemand eine Ahnung woran das liegt / liegen könnte?
Schön ist bei diesem Beispiel der fortlaufende Entwicklungsprozess von Lazarus zu erkennen (Windows):
Einträge:
Code: Alles auswählen
Berta
Ärger
Aaron
Öl
1
Code: Alles auswählen
1
Ärger
Aaron
Öl
Berta
Code: Alles auswählen
1
Aaron
Berta
Ärger
Öl
Das Gute ist, die Sortierung einer StringList stimmt im Lazarus Trunk mit der von Windows überein:
Code: Alles auswählen
1
Aaron
Ärger
Berta
Öl
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 6904
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: SringList sortiert merkwürdig
@Michel
Hast du es mit Linux auch probiert, oder bist du ein reiner Windows-Programmierer ?
Hast du es mit Linux auch probiert, oder bist du ein reiner Windows-Programmierer ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: SringList sortiert merkwürdig
Bis auf einen kurzen Androidausflug habe ich bisher Lazarus nur für Windows genutzt.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;