![]() |
Listenobjekte sortieren
hallo,
ich habe eine Klasse Playercollection die Player in einer liste speichert Eine eigenschaft der Klasse Player ist der integerwert score. Nun wollte ich die einzelnen Spieler nach den Punkten(score) sortieren. Dafür habe ich gedacht ich speichere die Player in einem array und wende auf dieses array ein sortierverfahren an. Allerdings komme ich nun etwas durcheinander, wenn ich den quicksort anwende da ich immernur die punkte ändere aber nicht die player genau. Wie sortiere ich also die punkte und nicht nur den punktestand?
Delphi-Quellcode:
oder würdet ihr mir ein anderes Suchverfahren empfeheln, da es sich um höchstens 10 Playerobjekte handelt die sortiert werden müssten.
procedure TPlayerCollection.SortScores(var field : Array of TPlayer) ;
var i : integer; begin getField(field); //feld änhält Playerobjekte quicksort(field, 0, self.Count-1); end; procedure TPlayerCollection.quicksort(var Field: array of TPlayer; ilow, ihigh: integer); var Low, High, Mid, T: Integer; begin Low := iLow; High := iHigh; Mid := Field[(Low + High) div 2].score; repeat while Field[Low].score < Mid do Inc(Low); while Field[High].score > Mid do Dec(High); if (Low <= High) then begin T := Field[Low].score; Field[Low].score := Field[High].score; Field[High].score := T; Inc(Low); Dec(High); end; until Low > High; if High > iLow then QuickSort(Field, iLow, High); if Low < iHigh then QuickSort(Field, Low, iHigh); end; |
Re: Listenobjekte sortieren
Wieso ein noch mal ein Array? Du hast doch schon alle Spieler in eine Objektlist. Schreib dir doch einfach eine Methode, die dir diese Liste sortiert. Wenn du deine Objektliste von TList abgeleitet hast, dann kannst du die Methode Exchange nutzen, um zwei Items zu vertauschen. Ein einfaches BubbelSort sollte reichen.
|
Re: Listenobjekte sortieren
danke für den Tipp, an die Möglichkeit habe ich gar nicht gedacht.
|
Re: Listenobjekte sortieren
Eine TList oder TObjectlist hat auch eine Methode Sort. Dafür muss man nur eine Compare-Funktion angeben. Ein Beispiel wäre evtl. so:
Delphi-Quellcode:
// Eine Compare-Funktion könnte so aussehen
function ScoreSort(item1,item2:pointer):integer; begin result := TPlayer(item1).score <= TPlayer(item2).Score; end; // Aufruf geht dann so Playlist.Sort(ScoreSort); |
Re: Listenobjekte sortieren
Delphi-Quellcode:
// Aufruf geht dann so
Playlist.Sort(@ScoreSort); |
Re: Listenobjekte sortieren
Hi, habe ein ähnliches Problem allerdings hab ich das nicht ganz verstanden. Ich suche eine Funktion mit der ich aus meiner Objektliste das Objekt bestimmen kann, welches den kleinsten Wert im Atribut "Größe: Single" besitzt.
|
Re: Listenobjekte sortieren
Wenn du das öfterst brauchst -> Liste nach diesem Feld sortieren, sonst durch liste gehen und kleinsten Wert und dessen Objekt merken
|
Re: Listenobjekte sortieren
wenn du nur den kleinsten Wert haben willst ohne die Liste zu sortieren dann:
Delphi-Quellcode:
so aufrufen wenn du dich innerhalb der Liste befindest, wenn du ausserhalb die Bestimmung durchführen willst dann das "Self." durch deine Objectlist ersetzen.
var
coKleinsterEintrag : TDeineKlasse; if Self.Count > 0 then coKleinsterEintrag := Self.Items[0]; for i := 0 to Self.Count - 1 do begin if Self.Items[i].Wert < coKleinsterEintrag.Wert then coKleinsterEintrag := Self.Items[i]; end; Gruß reli |
Re: Listenobjekte sortieren
Also ich hab das mal versucht bei mir zu übertragen allerdings funktioniert das noch nicht so richtig. Bei der If-Abfrage kommt eine Fehlermeldung dass bei MyObjectlist.Items[i].Groesse das Feld .Groesse nicht deklariert wäre.
Delphi-Quellcode:
Edit:
function TMyClass.GetNextGroesse: TMyObject;
var i: Integer; coKleinsteGroesse : TMyObject; begin if MyObjectlist.Count > 0 then coKleinsteGroesse := TMyObject(MyObjectlist.Items[0]); for i := 0 to MyObjectlist.Count - 1 do begin if MyObjectlist.Items[i].Groesse < coKleinsteGroesse.Groesse then coKleinsteGroesse := MyObjectlist.Items[i]; end; result := KleinsteGroesse; end; mit
Delphi-Quellcode:
geht es jetzt :)
if TMyObject(MyObjectlist.Items[i]).Groesse < coKleinsteGroesse.Groesse then
|
Re: Listenobjekte sortieren
Und bei
Delphi-Quellcode:
?
TMyObject(MyObjectlist.Items[i]).Groesse
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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 by Thomas Breitkreuz