![]() |
Fehler im Sortier-Algorythmus
Hi Leute,
ich hab mir nach dem Bubblesort-Verfahren 'nen Algorythmus geschrieben, der Daten sortiert. Die Daten sind in der Form dd-mm-jj in einer Listbox gespeichert. Nun werden sie übernommen. Es wird zuerst das Jahr verglichen, dann der Monat und dann der Tag. Das früheste Datum soll als erstes in der sortierten Listbox erscheinen. Allerdings kommt immer der Fehler: EStringListError: Das Maximum (7) wird überschritten :cry: Kann mir einer sagen, wieso? tia, gordon Hier der Code:
Delphi-Quellcode:
/edit: @alcaeus Hab doch glatt vergessen, den Code zu posten :oops: Soll nich wieder vorkommen!
////////////////////////////////////////////////////////////
//Die Einträge aus dem Übergebenen TString werden sortiert// //und in die Form10.Listbox2 eingefügt // //////////////////////////////////////////////////////////// procedure TForm10.BubbleSort(tStr:TStrings); var tag1,monat1,jahr1,n,Zaehler1,Zaehler2:integer; tag2,monat2,jahr2:integer; tausch,s:string; begin n:=tstr.Count; for Zaehler1 := n downto 2 do for Zaehler2 := 1 to Zaehler1-1 do begin {Das Jahr wird aus 1 herausgeschnitten} s:=tstr[Zaehler2]; delete(s,1,pos('-',s)); delete(s,1,pos('-',s)); jahr1:=strtoint(s); {Der Monat wird aus 1 herausgeschnitten} s:=tstr[Zaehler2]; delete(s,1,pos('-',s)); delete(s,pos('-',s),length(s)); monat1:=strtoint(s); {Der Tag wird aus 1 herausgeschnitten} s:=tstr[Zaehler2]; delete(s,pos('-',s),length(s)); tag1:=strtoint(s); {Das Jahr wird aus 2 herausgeschnitten} s:=tstr[Zaehler2+1]; delete(s,1,pos('-',s)); delete(s,1,pos('-',s)); jahr2:=strtoint(s); {Der Monat wird aus 2 herausgeschnitten} s:=tstr[Zaehler2+1]; delete(s,1,pos('-',s)); delete(s,pos('-',s),length(s)); monat2:=strtoint(s); {Der Tag wird aus 2 herausgeschnitten} s:=tstr[Zaehler2+1]; delete(s,pos('-',s),length(s)); tag2:=strtoint(s); if jahr1 > jahr2 then //Ist Jahr 1 Später als 2 begin //Ja, sie werden getauscht tausch:=tStr[Zaehler2]; tStr[Zaehler2]:=tStr[Zaehler2+1]; tStr[Zaehler2+1]:=tausch; end else //Nein, Jahr 2 ist Später oder gleich 1 begin if jahr1 = jahr2 then //Sind die Jahre gleich begin //Ja if monat1 > monat2 then //Ist Monat 1 größer als 2 begin //Ja, sie werden getauscht tausch:=tStr[Zaehler2]; tStr[Zaehler2]:=tStr[Zaehler2+1]; tStr[Zaehler2+1]:=tausch; end else //Nein, Monat 2 ist später oder gleich 1 begin if monat1 = monat2 then //Sind die Monate gleich begin //Ja if tag1 > tag2 then //Ist Tag 1 später als 2 begin //Ja, siw werden getauscht tausch:=tStr[Zaehler2]; tStr[Zaehler2]:=tStr[Zaehler2+1]; tStr[Zaehler2+1]:=tausch; end; end; end; end; end; end; Form10.ListBox2.Items:=tstr; end; |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
du sprengst einfach die Grenzen des StringGrids. Wahrscheinlich läuft deine Schleife bis StringList1.Count anstatt StringList1.Count-1 Aber ohne Code wird das hier nur ein Ratespiel. Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
Wenn ich aber
Delphi-Quellcode:
eingebe bleibt die zweite Listbox leer! :?
n:=tstr.count-1
|
Re: Fehler im Sortier-Algorythmus
Hi Martin,
wie versprochen, ohne Code wird das ein Ratespiel. Zeig doch bitte mal den Code der Sortierprozedur. Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
Hab den Code jetzt oben, in meinen ersten Beitrag reingepackt. Es ist eine Prozedure, die folgendes tut:
Hoffe, ich habe alle Klarheiten beseitigt :wink: |
Re: Fehler im Sortier-Algorythmus
Dein Progammcode sieht stark nach Spaghetti aus. :zwinker:
1.) BubbleSort ist eines der schlechtesten Sortierverfahren; verwende lieber Quicksort 2.) du musst den Sortieralgorythmus von den Daten trennen. Dazu gibt es einen Artikel in der Code-Library: ![]() |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
IMHO ist hier der Fehler:
Delphi-Quellcode:
Deine Liste hat 7 Einträge, diese sind von 0-6 durchnummeriert. Also müsste der Code so lauten:
n:=tstr.Count;
for Zaehler1 := n downto 2 do for Zaehler2 := 1 to Zaehler1-1 do
Delphi-Quellcode:
Bei der 2. Schleife bin ich mir nicht ganz sicher, aber bei der ersten ist 100%ig der Indexfehler drin.
n:=tstr.Count-1;
for Zaehler1 := n downto 1 do for Zaehler2 := 0 to Zaehler1-1 do Greetz alcaeus [add] Zitat:
Zitat:
[/add] |
Re: Fehler im Sortier-Algorythmus
@ shmia:
Danke für die Klasse, aber ich glaube BubbleSort reicht mir. Aber wie soll ich die Daten von dem Sortier-Algo trennen. Es muss doch jedes neue Datum aufgrund der Werte von Zaehler2 ausgelesen und in seine Bestandteile zerlegt werden (Jahr, Monat, Tag), wie sollte das anders gehen? @ alcaeus Habs jetzt geändert, so wie du geschrieben hast. Jetzt wird bei mir allerdings gar keine Liste ausgegeben... :wall: Bin für jede Hilfe dankbar, gordon |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
Zitat:
Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
Zitat:
![]() Und als Erweiterung zu dieser Basisklasse:
Delphi-Quellcode:
Und nun die Anwendung:
TSortStringGrid = class(TSortBaseClass)
protected function Compare(Index1, Index2: Integer): Integer;override; procedure Exchange(Index1, Index2: Integer);override; public AGrid : TStringGrid; end; function TSortStringGrid.Compare(Index1, Index2: Integer): Integer; begin // Hier ist die Stelle, an der der Vergleich durchgeführt wird // in diesem Beispiel wird nur die 1. Spalte zum Vergleich herangezogen Result := CompareText(AGrid.Cells[1, Index1], AGrid.Cells[1, Index2]); end; procedure TSortStringGrid.Exchange(Index1, Index2: Integer); var tmp : TStringList; begin // Vertauschen 2. Rows im StringGrid tmp := TStringList.Create; tmp.Assign(AGrid.Rows[Index1]); AGrid.Rows[Index1] := AGrid.Rows[Index2]; AGrid.Rows[Index2].Assign(tmp); tmp.Free; end;
Delphi-Quellcode:
var
sg : TSortStringGrid; begin sg := TSortStringGrid.Create; sg.AGrid := StringGrid1; // sg.QuickSort(1, StringGrid1.RowCount-1); sg.BubbleSort(1, StringGrid1.RowCount-1); sg.Free; end; |
Re: Fehler im Sortier-Algorythmus
@ shmia
Tut mir leid, das was du schreibst macht sicherlich alles Sinn, aber ich check gar nix :drunken: @ alcaeus: Hier ein paar Beispiele: 26-01-02 15-07-01 20-04-02 11-08-01 03-11-01 28-07-01 16-03-02 Das sind die 7 Einträge, die ich in meiner Listbox hab und die es zu sortieren gilt... Hoffe auf Hilfe... read you, Martin |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
ich habe mir Daniels Prozedur aus dem Sortieralgorithmen-Tut ausgeliehen, und die Funktion ein bisschen umgeschrieben. Jetzt werden die Daten absteigend sortiert:
Delphi-Quellcode:
Hoffe es passt.
procedure TForm1.NewBubbleSort(tStr: TStrings);
var i, j, n : Integer; tag1, monat1, jahr1, tag2, monat2, jahr2: integer; Data: array of String; s, temp: String; begin SetLength(Data, tStr.Count); for i := 0 to tStr.Count-1 do Data[i] := tStr[i]; n := tStr.Count-1; for i:= n downto 1 do begin for j:= 1 to i do begin s:=Data[j]; delete(s,1,pos('-',s)); delete(s,1,pos('-',s)); jahr1:=strtoint(s); {Der Monat wird aus 1 herausgeschnitten} s:=Data[j]; delete(s,1,pos('-',s)); delete(s,pos('-',s),length(s)); monat1:=strtoint(s); {Der Tag wird aus 1 herausgeschnitten} s:=Data[j]; delete(s,pos('-',s),length(s)); tag1:=strtoint(s); {Das Jahr wird aus 2 herausgeschnitten} s:=Data[j-1]; delete(s,1,pos('-',s)); delete(s,1,pos('-',s)); jahr2:=strtoint(s); {Der Monat wird aus 2 herausgeschnitten} s:=Data[j-1]; delete(s,1,pos('-',s)); delete(s,pos('-',s),length(s)); monat2:=strtoint(s); {Der Tag wird aus 2 herausgeschnitten} s:=Data[j-1]; delete(s,pos('-',s),length(s)); tag2:=strtoint(s); {Jahr vergleichen} if jahr1 > jahr2 then begin temp := Data[j-1]; Data[j-1] := Data[j]; Data[j] := temp; end; if jahr1 = jahr2 then begin if monat1 > monat2 then begin temp := Data[j-1]; Data[j-1] := Data[j]; Data[j] := temp; end; if monat1 = monat2 then begin if tag1 > tag2 then begin temp := Data[j-1]; Data[j-1] := Data[j]; Data[j] := temp; end; end; end; end; end; for i := 0 to tStr.Count-1 do ListBox2.Items.Add(Data[i]); end; Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
@ alcaeus
Super der Code funzt perfekt :thumb: Allerdings hab ich noch eine Frage: Bei mir zeigt er das neueste Datum als erstes und das älteste als letztes an. Gibt es eine Möglichkeit das schnell umzudrehen, ohne vorher alles in eine gesonderte Liste zu exportieren und wieder falsch herum zu imortieren? Vielen Dank auf jeden Fall soweit. :cheers: :bouncing4: :bounce2: :bounce1: :bouncing4: :bounce2: :bounce1: |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
Zitat:
Delphi-Quellcode:
in
for i := 0 to tStr.Count-1 do
ListBox2.Items.Add(Data[i]);
Delphi-Quellcode:
um.
for i := tStr.Count-1 downto 0 do
ListBox2.Items.Add(Data[i]); Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
Ich glaube du musst nur die '>' in '<' umdrehen.
|
Re: Fehler im Sortier-Algorythmus
Mit '<' statt '>' sortiert er sie mir richtig.
Vielen Dank für Eure Hilfe!!! :thumb: :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz