[Delphi 3] TList sorteren

Pagina: 1
Acties:
  • 317 views sinds 30-01-2008
  • Reageer

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Hoi allemaal,

Ik heb een TList met allemaal mutaties daarin, maar hoe kan ik deze nou sorteren?

Dit wordt in de TList Mutaties gezet

Mutaties.add(TMutatie.Create(datum,mutatie,naam,bedrag,soort,reknr,tegennr,mdeling));

Hoe moet ik deze nou sorteren op bijv. bedrag of tegennr oid....???

Het kan volgens mij wel met Mutaties.Sort alleen hoe werkt dat??

Verwijderd

Dat gaat idd met Sort, maar daar geef je een check-functie aan mee. In jouw 1e voorbeeld (op bedrag) bv:
code:
1
2
3
4
5
6
7
8
function SorteerOpBedrag(ALo, AHi: pointer): integer;
begin
  Result := 0;    // default, beide zijn gelijk
  if TMutatie(ALo).Bedrag < TMutatie(AHi).Bedrag then
    Result := -1;
  if TMutatie(ALo).Bedrag > TMutatie(AHi).Bedrag then
    Result := 1;
end;

Mutaties.Sort(SorteerOpBedrag) gebruikt nu simpel gezegd die functie om te bepalen of 'ie 2 items moet omwisselen (Result = 1).

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Op vrijdag 21 december 2001 10:54 schreef Afterlife het volgende:
Dat gaat idd met Sort, maar daar geef je een check-functie aan mee. In jouw 1e voorbeeld (op bedrag) bv:
code:
1
2
3
4
5
6
7
8
function SorteerOpBedrag(ALo, AHi: pointer): integer;
begin
  Result := 0;    // default, beide zijn gelijk
  if TMutatie(ALo).Bedrag < TMutatie(AHi).Bedrag then
    Result := -1;
  if TMutatie(ALo).Bedrag > TMutatie(AHi).Bedrag then
    Result := 1;
end;

Mutaties.Sort(SorteerOpBedrag) gebruikt nu simpel gezegd die functie om te bepalen of 'ie 2 items moet omwisselen (Result = 1).
Ok tnx voor de tip, alleen nou wist ik vorig jaar nog wel hoe je een lijst kan sorteren, maar nu ffies niet meer. Stel ik heb de lijst [2,4,9,6,1,3,10,5] Hoe kan je die nou ook alweer sorteren? Als je die goed wilt sorteren moet je er volgens mij wel vaker dan 1x door heen lopen...

Verwijderd

TList.Sort gebruikt hier zelf een aardig efficient QuickSort algoritme voor.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16:30

Janoz

Moderator Devschuur®

!litemod

Op vrijdag 21 december 2001 11:24 schreef PleXtor het volgende:
Als je die goed wilt sorteren moet je er volgens mij wel vaker dan 1x door heen lopen...
Om precies te zijn moet je een lijst met N elementen N log(N)/N keer doorlopen :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Het lukt me echt niet hoor...

Misschien ben ik wel dom bezig, maar als ik Mutaties.Sort(SorteerOpBedrag) doe dan begint hij te zeuren dat het geen TListSortCompare is...

Ik heb al van alles geprobeerd, deze heb ik oa ook geprobeerd:

Mutaties.Sort(SorteerOpBedrag(Mutaties[i],Mutaties[i+1]));

Dan zegt ie: Incompatible types: TListSortCompare and Integer....

Kan iemand mij hier misschien bij helpen :?

Verwijderd

Tuurlijk, de vergelijk functie moet er zo uitzien:
code:
1
function Vergelijk(Item1, Item2: Pointer): Integer;

Bij jouw heet hij SorteerOpBedrag ipv Vergelijk, denk ik.

Post hier jouw code, dan kijk ik wel wat fout is.

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Bedrag1Click(Sender: TObject);
var
  max, min, i : integer;
begin
  i := 0;
  Mutaties.Sort(SorteerOpBedrag(Mutaties[i],Mutaties[i+1]));

end;

function TForm1.SorteerOpBedrag(ALo, AHi: pointer): integer;
begin
  Result := 0;    // default, beide zijn gelijk
  if TMutatie(ALo).Bedrag < TMutatie(AHi).Bedrag then
    Result := -1;
  if TMutatie(ALo).Bedrag > TMutatie(AHi).Bedrag then
    Result := 1;
end;

Verwijderd

Je moet SorteerOpBedrag geen functie van een object maken, hier dus TForm1. Dat snapt Delphi niet.

Maak deze functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function SorteerOpBedrag(ALo, AHi: pointer): integer;
begin
  Result := 0;    // default, beide zijn gelijk
  if TMutatie(ALo).Bedrag < TMutatie(AHi).Bedrag then
    Result := -1;
  if TMutatie(ALo).Bedrag > TMutatie(AHi).Bedrag then
    Result := 1;
end;

procedure TForm1.Bedrag1Click(Sender: TObject);
var
  max, min, i : integer;
begin
  i := 0;
  Mutaties.Sort(SorteerOpBedrag);
end;

En zet die boven de procedure Bedrag1Click.

edit:

De aanroep van Sort was verkeerd, je moet alleen de vergelijk functie doorgeven

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Op zaterdag 22 december 2001 11:42 schreef DiFool het volgende:

[knip]

En zet die boven de procedure Bedrag1Click.
En hoe zet je dat er boven? Bedoel je gewoon even zelf een procedure aan maken of in die bedragclick procedure inmixen... :?

Verwijderd

Zie mijn edit

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Okidokie Tnx....

Verwijderd

Graag gedaan :)

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Hmmz nu krijg ik de melding:

Incompatible types: regular procedure and method pointer...

En klaagt over Mutaties.Sort(SorteerOpBedrag);

Verwijderd

Heb je TForm1. voor SorteerOpBedrag weggehaald?

En de definitie van SorteerOpBedrag in TForm1?

  • PleXtor
  • Registratie: Maart 2000
  • Laatst online: 12-04-2025
Je moet hem boven uit de TForm1 classe ook verwijderen... dan gaat het wel goed... Tnx
Pagina: 1