Array Sortieren
Hi Leute...
Ich würde gerne ein Array nach z.B. einem Namen sortieren (Alphabetisch). Wie stelle ich das an ? Danke im Voraus. |
Re: Array Sortieren
|
Re: Array Sortieren
und wie verändere ich dann die Position in einem ListBox ?
Wenn ich das noch wüsste ;) Danke. |
Re: Array Sortieren
An deiner Stelle würde ich das array sortieren und dann in die ListBox einlesen. Das ist das Einfachste.
|
Re: Array Sortieren
Hmm ich Dummdödel ;)
Noch ne letzte Frage
Delphi-Quellcode:
Wenn ich das Array so auslese, dann entstehen lücken zwischen den Feldern in der ListBox... also ein Bsp.
with ListBox1 do
begin For i:=1 to high(SchuelerArr) do begin Items.Add(SchuelerArr[i].Name); end end;
Delphi-Quellcode:
und
SchuelerArr[2].Name:='Bla';
Delphi-Quellcode:
Dann enstehen eben zwischen 2 und dem Feld 200 198 Lücken ;) wie kann ich das beheben ? :gruebel:
SchulerArr[200].Name:='Blupp';
DANKE :love: |
Re: Array Sortieren
Ich verstehe nicht ganz, wie du das machst, also ich würde es, mit Zahlen, so lösen. Buchstaben ist ähnlich:
Delphi-Quellcode:
procedure TForm1.Swap(var i,j: integer);
var h: integer; begin h:=i; i:=j; j:=h; end; procedure TForm1.Sortiere; var i,j: integer; begin for i:=0 to ListBox1.Count-1 do for j:=i+1 to ListBox1.Count do begin if tab[j]<tab[i] then Swap(tab[i],tab[j]); end; end; procedure TForm1.ArrayFuellen; var i: integer; von, bis: integer; begin ListBox1.Clear; for i:=0 to 200 do begin tab[i]:=random(101); //Zufallszahlen von 0-100 ListBox1.Items.Add(IntToStr(tab[i])); end; end; procedure TForm1.SortClick(Sender: TObject); var i: integer; begin Sortiere; ListBox2.Clear; for i:=0 to ListBox1.Count-1 do ListBox2.Items.Add(IntToStr(tab[i])); end; |
Re: Array Sortieren
Die zweite Schleife (j := ...) sollte aber nur bis ListBox1.Count - 1 gehen, sonst gibt's nen schönen Fehler. Wobei ich mich beim Sortieren nur auf das Array (mit Hilfe von low und High) beziehen würde und anschließend die ListBox clearen und das Array neu einfügen würde.
|
Re: Array Sortieren
Zitat:
Delphi-Quellcode:
is aber nicht hilfreich, wenn man zum beispiel ein leerzeichen oder so eingibt, dann erscheint trotzdem ein leerer eintrag.
with ListBox1 do
begin For i:=1 to high(SchuelerArr) do begin if (SchuelerArr[i].Name<>'') then Items.Add(SchuelerArr[i].Name); end end; ciao haegar |
Re: Array Sortieren
Zitat:
|
Re: Array Sortieren
Zitat:
Danke. |
Re: Array Sortieren
Zitat:
woe muss ich denn diese Prozedur umändern, damit ich sie auf String bzw. Buchstaben anwenden kann ? |
Re: Array Sortieren
Schon mal jemand auf die Idee gekommen die Eigenschaft Sorted von der Listbox auf True zu stellen? :roll:
|
Re: Array Sortieren
Zitat:
Für diesen Tip :mrgreen: :cheers: :bounce2: :hi: |
Re: Array Sortieren
Zitat:
Sortet auf true, dann zurück ins array, oder wie? Das ist ja der größte Bullshit! |
Re: Array Sortieren
Zitat:
|
Re: Array Sortieren
Zitat:
Nur, wenn man ein Array sortieren möchte, dann sortiert man das per Sortieralgo und nicht rein in ListBox, sortieren lassen, rein ins Array. Ist sonst 1.: umständlicher 2.: langsamer |
Re: Array Sortieren
Kuck sein drites Posting an. Es ging wohl von anfang an um eine Listbox. Ist dies nicht der fall, dann ist es natürlich Blödsinn eine Listbox zunehmen. Dann entwerder einen Sortier-Algorithmus nehmen oder eine StringListe je nach dem.
|
Re: Array Sortieren
Klar geht es um eine ListBox, daran zweifelt ja keiner.
Nur ist es eindeutig besser, erst zu sortieren, und dann in die ListBox. Wenn man die Daten weiterverabeiten möchte, ist es doch auch viel einfacher und besser, auf das Array zuzugreifen, als auf die ListBox. OK, hier will mich vielleicht keiner verstehen, egal. :? |
Re: Array Sortieren
Zitat:
Hmmm das mit dem ListBox Sorted ist ja nur für die Oberfläche... das nützt mir ja nix, denn das Array bleibt ja so wie es ist. Nochmal zu meiner eigentlichen Frage: Wie änder ich einen Sortier Algo so um, dass ich damit nach Strings bzw. Buchstaben sortieren kann???? :wiejetzt: :wall: :wall: |
Re: Array Sortieren
Zitat:
Jo, eine Seite weiter vorne steht ja, wie's geht. ;) |
Re: Array Sortieren
Zitat:
Meine E I G E N T L I C H E Frage wurde in diesem Thread noch nicht beantwortet :) Denn ich hab nie was von Integer Werten gesprochen nur von Strings Würde ich diese Sortier Algos umändern können, dass man mit denen Striungs sortieren kann, würde ich net seit Tagen versuchen es zu packen :/ |
Re: Array Sortieren
Zitat:
Delphi-Quellcode:
Ungetestet!!
procedure TForm1.Swap(var i,j: string);
var h: string; begin h:=i; i:=j; j:=h; end; procedure TForm1.Sortiere; var i,j: integer; begin for i:= Low(tab) to High(tab) do for j:= i + 1 to High(tab) do begin if tab[j]<tab[i] then Swap(tab[i],tab[j]); end; end; procedure TForm1.ArrayFuellen; var i: integer; begin ListBox1.Clear; for i:=0 to 200 do begin tab[i] := InttoStr(random(101)); //Zufallszahlen von 0-100 ListBox1.Items.Add(tab[i]); end; end; procedure TForm1.SortClick(Sender: TObject); var i: integer; begin Sortiere; ListBox2.Clear; for i := Low(tab) to High(tab) do ListBox2.Items.Add(tab[i]); end; |
Re: Array Sortieren
Zitat:
Erst einmal DANKE, aber warum dieses ListBox2 ? Kann man es denn nicht so umändern, dass alles gleich in der ListBox1 geschiet ? Muss doch klappen ?!!! Aber das ist erstmal unwichtig, schaff ich auch alleine :thuimb: |
Re: Array Sortieren
Da kannst du einfach 2 durch 1 ersetzen! Dies war wahrscheinlich nur da drin, damit man sieht wie es vorher aussah und nachher aussieht.
|
Re: Array Sortieren
Zitat:
|
Re: Array Sortieren
Hallo,
das einfachste ist: Speichere die Records nicht in einem Array, sondern in TList. TList hat eine Sort Methode. Näheres siehe OH. |
Re: Array Sortieren
da gibt's nochn Paar fehler...
1. [Fehler] Unit1.pas(152): Deklaration von 'Swap' unterscheidet sich von vorheriger Deklaration
Delphi-Quellcode:
2. [Fehler] Unit1.pas(166): Inkompatible Typen
procedure TForm1.Swap(var i,j: String);
Delphi-Quellcode:
3. [Fehler] Unit1.pas(166): Zu viele Parameter
If TelefonBArr[j]<TelefonBArr[i] then Swap(TelefonBArr[i],TelefonBArr[j]);
Delphi-Quellcode:
4. [Fehler] Unit1.pas(176): Inkompatible Typen: 'String' und 'TTelefonB'
If TelefonBArr[j]<TelefonBArr[i] then Swap(TelefonBArr[i],TelefonBArr[j]);
Delphi-Quellcode:
ListBox1.Items.Add(TelefonBArr[i]);
Edit: @Jens: Muss sie aber in einem Array speichern :) |
Re: Array Sortieren
zu 1.
Delphi-Quellcode:
muss unter public, private oder, wo du's hast, genau so deklariert sein.
procedure TForm1.Swap(var i,j: String);
Einen String kann man per ACSII-Code sortieren, das hab ich schon in meinem ersten Post geschrieben.
Delphi-Quellcode:
gibt z.B den Integer für den Buchstaben S zurück
Ord['s']
[Edit]FAlls du's so sortierst, dann kannst du meinen Code so lassen und musst nix in einen string umändern, da ja nur nach den Integer-Werten weiterhin sortiert wird.[/Edit] |
Re: Array Sortieren
Vielleicht hättest du mal von Anfang an gesagt, dass du mit einem record spielst.
Delphi-Quellcode:
Und in das ListBox kannst du natürlich auch nur einen Eintrag vom record immer hinzufügen. Also:
private
procedure Swap(var i,j: integer); ... procedure TForm1.Swap(var i,j: integer); var dummy: TelefonBArrrecord; // wie auch immer dein record heißt begin //kann auch sein, dass man records nicht so einfach "übertragen" kann dummy := TelefonBArr[j]; TelefonBArr[i] := TelefonBArr[j]; TelefonBArr[j] := dummy; end; procedure TForm1.Sortiere; var i,j: integer; begin for i:= Low(tab) to High(tab) do for j:= i + 1 to High(tab) do begin if tab[j].Name< tab[i].Namethen Swap(i,j); end; end;
Delphi-Quellcode:
Wenn das jetzt nicht deinen Gewolltem entspricht, dann poste mal endlich genua was du willst, bzw. die relevanten Stellen deines bisherigen Codes.
ListBox1.Items.Add(TelefonBArr[i].Name);
|
Re: Array Sortieren
Zitat:
|
Re: Array Sortieren
Zitat:
|
Re: Array Sortieren
OK, schau dir meinen letzten Beitrag an und schau ob das jetzt geht.
Dann hättest du vielleicht nochmal explizit deinen record Aufbau bitte posten sollen. |
Re: Array Sortieren
Hmmm...
Wenn ich nun diesen Record Fülle Bsp.: TelefonBArr[1].Name:='Bla'; und TelefonBArr[2].Name:='BlaBla'; dann auf Sortiere klicke wird die ListBox Cleared und dann passiert nix mehr ? :gruebel: |
Re: Array Sortieren
Poste doch mal bitte deinen bisherigen für uns zur Problemlösung relevanten Code!
|
Re: Array Sortieren
Zitat:
if TelefonBArr[j].Name< TelefonBArr[i].Name then Swap(i,j); <= man kann keine FOR Schleifen variablen als var-parameter an andere Prozeduren übergeben ! (Sagt Delphi :D ) |
Re: Array Sortieren
Jo, wenn dann so:
Delphi-Quellcode:
Swap(TelefonBArr[i], TelefonBArr[j])
|
Re: Array Sortieren
Zitat:
Matze's Vorschlag bringt nichts. |
Re: Array Sortieren
Zitat:
Fehler: Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen. @Typercon: Jo jetzt kann man wieder compilen aber das problem mit der leeren ListBox besteht weiterhin |
Re: Array Sortieren
Natürlich nicht, nimm das var weg und der Teil wird gehen! Du sollst nur den Index übergeben.
Dann poste doch mal bitte deinen jetzigen Stand vom Code. Bin bis Donnerstag wahrscheinlich nicht mehr online. |
Re: Array Sortieren
So hier mal der bisherige code:
Delphi-Quellcode:
type TDatum = record
Tag : Byte; Monat : Byte; Jahr : Integer; end; TSchuelerRec = record Name : String[25]; Vorname : String[25]; Gebdatum : TDatum; VName : String[25]; MName : String[25]; EinschulD : TDatum; Klasse : Char; Klassenst : Integer; Status : Boolean; end; TSchuelerArr = Array[1..100] of TSchuelerRec; var SchuelerArr : TSchuelerArr; //mir egal welchen arr namen ihr nimmt... :) ... ... ... procedure TForm1.Swap(i,j: Integer); var dummy: TSchuelerRec; begin dummy := SchuelerArr[j]; SchuelerArr[i] := SchuelerArr[j]; SchuelerArr[j] := dummy; end; procedure TForm1.Sortiere; var i,j: integer; begin for i:= Low(SchuelerArr) to High(SchuelerArr) do for j:= i + 1 to High(SchuelerArr) do begin if SchuelerArr[j].Name<SchuelerArr[i].Name then Swap(i, j) end; end; procedure TForm1.SortBtnClick(Sender: TObject); var i: integer; begin Sortiere; ListBox1.Clear; For i := Low(SchuelerArr) to High(SchuelerArr) do begin If (SchuelerArr[i].Name<>'') then ListBox1.Items.Add(SchuelerArr[i].Name); end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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