Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Array Sortieren (https://www.delphipraxis.net/14446-array-sortieren.html)

Plat 9. Jan 2004 14:58


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.

Matze 9. Jan 2004 15:00

Re: Array Sortieren
 
Die Buchstaben kannst du mittels ACSII Code sortieren.

Sortieralgos findest du hier.

Plat 9. Jan 2004 15:04

Re: Array Sortieren
 
und wie verändere ich dann die Position in einem ListBox ?

Wenn ich das noch wüsste ;)

Danke.

Matze 9. Jan 2004 15:07

Re: Array Sortieren
 
An deiner Stelle würde ich das array sortieren und dann in die ListBox einlesen. Das ist das Einfachste.

Plat 9. Jan 2004 15:13

Re: Array Sortieren
 
Hmm ich Dummdödel ;)


Noch ne letzte Frage

Delphi-Quellcode:
with ListBox1 do
    begin
      For i:=1 to high(SchuelerArr) do
        begin
          Items.Add(SchuelerArr[i].Name);
        end
    end;
Wenn ich das Array so auslese, dann entstehen lücken zwischen den Feldern in der ListBox... also ein Bsp.
Delphi-Quellcode:
SchuelerArr[2].Name:='Bla';
und
Delphi-Quellcode:
SchulerArr[200].Name:='Blupp';
Dann enstehen eben zwischen 2 und dem Feld 200 198 Lücken ;) wie kann ich das beheben ? :gruebel:


DANKE :love:

Matze 9. Jan 2004 15:15

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;

Tpercon 9. Jan 2004 15:37

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.

Haegar 9. Jan 2004 15:40

Re: Array Sortieren
 
Zitat:

Zitat von Plat
wie kann ich das beheben ?

ganz einfach...
Delphi-Quellcode:
with ListBox1 do
    begin
      For i:=1 to high(SchuelerArr) do
        begin
          if (SchuelerArr[i].Name<>'') then  
            Items.Add(SchuelerArr[i].Name);
        end
    end;
is aber nicht hilfreich, wenn man zum beispiel ein leerzeichen oder so eingibt, dann erscheint trotzdem ein leerer eintrag.

ciao haegar

Tpercon 9. Jan 2004 15:46

Re: Array Sortieren
 
Zitat:

Zitat von Haegar
Zitat:

Zitat von Plat
wie kann ich das beheben ?

is aber nicht hilfreich, wenn man zum beispiel ein leerzeichen oder so eingibt, dann erscheint trotzdem ein leerer eintrag.

Dafür gibt es dann ja die Funktion trim.

Plat 9. Jan 2004 15:46

Re: Array Sortieren
 
Zitat:

Zitat von Haegar
Zitat:

Zitat von Plat
wie kann ich das beheben ?

ganz einfach...
Delphi-Quellcode:
with ListBox1 do
    begin
      For i:=1 to high(SchuelerArr) do
        begin
          if (SchuelerArr[i].Name<>'') then  
            Items.Add(SchuelerArr[i].Name);
        end
    end;
is aber nicht hilfreich, wenn man zum beispiel ein leerzeichen oder so eingibt, dann erscheint trotzdem ein leerer eintrag.

ciao haegar

Das mit dem Leerzeichen ist kein Problem, denn man muss ja einen Namen eigneben ! :D

Danke.

Plat 12. Jan 2004 21:44

Re: Array Sortieren
 
Zitat:

Zitat von Matze
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;


woe muss ich denn diese Prozedur umändern, damit ich sie auf String bzw. Buchstaben anwenden kann ?

Luckie 12. Jan 2004 21:46

Re: Array Sortieren
 
Schon mal jemand auf die Idee gekommen die Eigenschaft Sorted von der Listbox auf True zu stellen? :roll:

Plat 12. Jan 2004 21:56

Re: Array Sortieren
 
Zitat:

Zitat von Luckie
Schon mal jemand auf die Idee gekommen die Eigenschaft Sorted von der Listbox auf True zu stellen? :roll:

Danke Danke Danke !

Für diesen Tip :mrgreen: :cheers: :bounce2: :hi:

Matze 13. Jan 2004 11:03

Re: Array Sortieren
 
Zitat:

Zitat von Luckie
Schon mal jemand auf die Idee gekommen die Eigenschaft Sorted von der Listbox auf True zu stellen? :roll:

Nix gegen dich, aber du bist doch normalerweise derjenige, der seine Aufgaben gescheit lösen will.

Sortet auf true, dann zurück ins array, oder wie?
Das ist ja der größte Bullshit!

Luckie 13. Jan 2004 11:50

Re: Array Sortieren
 
Zitat:

Zitat von Matze
Sortet auf true, dann zurück ins array, oder wie?
Das ist ja der größte Bullshit!

Hä? Wieso? Wenn Sorted auf True steht, wird automatisch von der Listbox sortiert. Wenn du da mit Add einen Item hinzufügst, wird der automatisch an der richtigen Stelle eingefügt. Also beim nächsten mal etwas vorsichtiger mit den Kraftausdrücken sein bitte. :roll:

Matze 13. Jan 2004 11:52

Re: Array Sortieren
 
Zitat:

Zitat von Luckie
Also beim nächsten mal etwas vorsichtiger mit den Kraftausdrücken sein bitte. :roll:

Sorry, ich meinte es nicht so streng. ;)

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

Luckie 13. Jan 2004 11:56

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.

Matze 13. Jan 2004 12:01

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. :?

Plat 13. Jan 2004 13:16

Re: Array Sortieren
 
Zitat:

Zitat von Matze
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. :?


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:

Matze 13. Jan 2004 13:19

Re: Array Sortieren
 
Zitat:

Zitat von Plat
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.

Juhuu, ich hab Recht!

Jo, eine Seite weiter vorne steht ja, wie's geht. ;)

Plat 13. Jan 2004 13:20

Re: Array Sortieren
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Plat
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.

Juhuu, ich hab Recht!

Jo, eine Seite weiter vorne steht ja, wie's geht. ;)

Wie was geht?

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 :/

Tpercon 13. Jan 2004 13:22

Re: Array Sortieren
 
Zitat:

Zitat von Plat
woe muss ich denn diese Prozedur umändern, damit ich sie auf String bzw. Buchstaben anwenden kann ?

Du mußt doch einfach überall wo integer auftauchen, dies in strings umbauen. Das sollte jeder können. Wie hast du das array eigentlich deklariert? fest, dynamisch?
Delphi-Quellcode:
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;
Ungetestet!!

Plat 13. Jan 2004 13:25

Re: Array Sortieren
 
Zitat:

Zitat von Tpercon
Zitat:

Zitat von Plat
woe muss ich denn diese Prozedur umändern, damit ich sie auf String bzw. Buchstaben anwenden kann ?

Delphi-Quellcode:
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;
Ungetestet!!


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:

Tpercon 13. Jan 2004 13:26

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.

Plat 13. Jan 2004 13:35

Re: Array Sortieren
 
Zitat:

Zitat von Tpercon
Da kannst du einfach 2 durch 1 ersetzen! Dies war wahrscheinlich nur da drin, damit man sieht wie es vorher aussah und nachher aussieht.

Ok danke euch !!!! Werds gleich mal testen... wenss Komplikationen gibt, weiß ich ja wo mir geholfen wird :)

Jens Schumann 13. Jan 2004 13:44

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.

Plat 13. Jan 2004 13:47

Re: Array Sortieren
 
da gibt's nochn Paar fehler...

1. [Fehler] Unit1.pas(152): Deklaration von 'Swap' unterscheidet sich von vorheriger Deklaration
Delphi-Quellcode:
  procedure TForm1.Swap(var i,j: String);
2. [Fehler] Unit1.pas(166): Inkompatible Typen
Delphi-Quellcode:
  If TelefonBArr[j]<TelefonBArr[i] then Swap(TelefonBArr[i],TelefonBArr[j]);
3. [Fehler] Unit1.pas(166): Zu viele Parameter
Delphi-Quellcode:
  If TelefonBArr[j]<TelefonBArr[i] then Swap(TelefonBArr[i],TelefonBArr[j]);
4. [Fehler] Unit1.pas(176): Inkompatible Typen: 'String' und 'TTelefonB'
Delphi-Quellcode:
  ListBox1.Items.Add(TelefonBArr[i]);


Edit:

@Jens: Muss sie aber in einem Array speichern :)

Matze 13. Jan 2004 13:50

Re: Array Sortieren
 
zu 1.
Delphi-Quellcode:
procedure TForm1.Swap(var i,j: String);
muss unter public, private oder, wo du's hast, genau so deklariert sein.


Einen String kann man per ACSII-Code sortieren, das hab ich schon in meinem ersten Post geschrieben.

Delphi-Quellcode:
Ord['s']
gibt z.B den Integer für den Buchstaben S zurück

[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]

Tpercon 13. Jan 2004 13:51

Re: Array Sortieren
 
Vielleicht hättest du mal von Anfang an gesagt, dass du mit einem record spielst.

Delphi-Quellcode:
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;
Und in das ListBox kannst du natürlich auch nur einen Eintrag vom record immer hinzufügen. Also:
Delphi-Quellcode:
ListBox1.Items.Add(TelefonBArr[i].Name);
Wenn das jetzt nicht deinen Gewolltem entspricht, dann poste mal endlich genua was du willst, bzw. die relevanten Stellen deines bisherigen Codes.

Matze 13. Jan 2004 13:52

Re: Array Sortieren
 
Zitat:

Zitat von Tpercon
Vielleicht hättest du mal von Anfang an gesagt, dass du mit einem record spielst.

*zustimm* Alles umsonst :pale:

Plat 13. Jan 2004 13:57

Re: Array Sortieren
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Tpercon
Vielleicht hättest du mal von Anfang an gesagt, dass du mit einem record spielst.

*zustimm* Alles umsonst :pale:

Wie alles umsonst??? Tut mir leid, aber in meinem 3 - 5 post auf der ersten Seite sieht man doch, dass ich mit Records arbeite BlaBlaArr.Name...

Tpercon 13. Jan 2004 14:00

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.

Plat 13. Jan 2004 14:23

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:

Tpercon 13. Jan 2004 14:26

Re: Array Sortieren
 
Poste doch mal bitte deinen bisherigen für uns zur Problemlösung relevanten Code!

Plat 13. Jan 2004 16:00

Re: Array Sortieren
 
Zitat:

Zitat von Tpercon
Poste doch mal bitte deinen bisherigen für uns zur Problemlösung relevanten Code!

ich glaube zu wissen wo der Fehler liegt.

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 )

Matze 13. Jan 2004 16:30

Re: Array Sortieren
 
Jo, wenn dann so:
Delphi-Quellcode:
Swap(TelefonBArr[i], TelefonBArr[j])

Tpercon 13. Jan 2004 16:40

Re: Array Sortieren
 
Zitat:

Zitat von Plat
Zitat:

Zitat von Tpercon
Poste doch mal bitte deinen bisherigen für uns zur Problemlösung relevanten Code!

ich glaube zu wissen wo der Fehler liegt.

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 )

Natürlich, das var muß in der Prozedur weg, dann geht's! Hatte ich auf die Schnelle nicht beachtet.

Matze's Vorschlag bringt nichts.

Plat 13. Jan 2004 16:41

Re: Array Sortieren
 
Zitat:

Zitat von Matze
Jo, wenn dann so:
Delphi-Quellcode:
Swap(TelefonBArr[i], TelefonBArr[j])

habe ich auch grade mal versucht aber geht auch nicht...

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

Tpercon 13. Jan 2004 16:44

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.

Plat 13. Jan 2004 16:51

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.
Seite 1 von 2  1 2      

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