Types Sortieren? [Gelöst]
Übersicht

bruce85Betreff: Types Sortieren? [Gelöst] |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich möchte gerne meine Type einträge nach X Anzahl Sortieren, dazu habe ich folgende Methode innherlab des Types verwendet: Code: [AUSKLAPPEN] Method compare:Int(other:Object)
If Not TTest(other) Then .. Return 0 Local o:TTest = TTest(other) If o.XAnzahl > self.XAnzahl Return 1 ElseIf o.XAnzahl < self.XAnzahl Return -1 EndIf Return 0 End Method leider werden die einträge nicht sortiert, es scheint so, als würde diese Methode überhaupt nicht ausgeführt werden. Code: [AUSKLAPPEN] Global TestList:TList = New TList
Type TTest Field XAnzahl:Int Field YAnzahl:Int Field Timer:Int=MilliSecs() Field Move:Int Method New() TestList.AddLast(Self) End Method Method compare:Int(other:Object) If Not TTest(other) Then .. Return 0 Local o:TTest = TTest(other) If o.XAnzahl > self.XAnzahl Return 1 ElseIf o.XAnzahl < self.XAnzahl Return -1 EndIf Return 0 End Method End Type Wisst ihr Vielleicht was ich falsch gemacht habe? Ich bedanke mich schonmal im Voraus. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
- Zuletzt bearbeitet von bruce85 am Mi, Jan 06, 2010 18:21, insgesamt einmal bearbeitet
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst der Liste natürlich auch sagen, wann sie sich sortieren soll ![]() z.B. nach jedem neuen Einfügen: BlitzMax: [AUSKLAPPEN]
|
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
bei einem meiner projekte sieht das fast gleich aus und funktioniert:
BlitzMax: [AUSKLAPPEN] ; so mach ich das sortieren: |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke euch.
Es funktioniert irgendwie nicht, es hat überhaupt keine Wirkung. Ich habe Testhalber mal statt AddLast >> AddFirst verwendet, eigentlich sollten die einträge dann verkehrtrum angezeigt werden, noch nicht einmal das funktioniert. Edit: Ich denke ich weiss wieso es nicht funktioniert... Jeder Type eintrag hat seine eigene X Position und deshalb wird der eintrag dort immer an der gleiche position gezeichnet. Ich werde es mal versuchen zu ändern. Edit2: Nun funktioniert das mit dem Sortieren der einträge. Das Problem war, das ich beim erstellen des Type Eintrag eine X Position zugewiesen habe, das habe ich dann entfernt und beim Zeichnen der einträge habe ich dann einen Zähler verwendet und diese nach jede eintrag mit 140 Multipliziert für die X Position und nun werden die einträge nach der XAnzahl Sortiert und richtig gezeichnet. Danke euch trotzdem für die Hilfe. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
amon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
So wie Du dein Compare Implementiert hast, kannst Du ein Problem bekommen wenn Du auf der Liste ein List.Remove(o:Object) aufrufst. Das Problem liegt in dem Codestück Code: [AUSKLAPPEN] If Not TTest(other) Then .. Return 0 Die 0 bedeutet für BLitzmax "Ah, die beiden Objekte sind gleich" --> ObjektIdentität. Wenn du jetzt auf die Liste meineListe:TList ein meineList.remove(irgendeinObjektDasNichtInDerListeIstUndAuchEinenAnderenTypHat) aufrufst, dann wird dir das das erste Objekt aus der Liste rauslöschen. Warum? Es hat einen anderen Typ, daher schlägt der Vergleich fehl, Du gibst 0 zurück - BlitzMax glaubt "Ah, das ist mein gesuchtes Objekt - das hau ich aus der Liste raus" und schon wunderst Du dich, warum eigentlich die komplett falschen Dinge aus deiner Liste verschwinden. Ein anderes Szenario wäre z.B. wenn du mehrer Werte in deinem Type verwendest, sagen wir der Einfachheit halber X,Y,Z als Koordinaten. In deiner Compare Methode verlgeichst du nur die Z Koordinaten, weil was anderes interessiert dich nicht. Wenn wir wieder die delete Methode aufrufen (diesmal sogar mit dem richtigen typ) und du BMax mitteilst lösche das Ojekt aus der Liste mit den Koords x=2,y=4,x=8 und in der Liste ist aber unglücklicherweise ein Objekt mit den Koords x=14, y=-5, x=8 wird das rausgelöscht, weil 8 = 8 und damit wäre es das gleich Objekt für BMax. Lösungen? Entweder: höllisch aufpassen beim implementieren der Compare Methode Oder: Die SortList Funktion verwenden. Dieser Funktion kann man eine eigene Vergleichsmethode mitgeben und braucht das .compare des Typs nicht anzpassen. Die Funktion schreibt man so hin: Code: [AUSKLAPPEN] Function SuperDuperVergleichsFunktion:Int( o1:Object,o2:Object )
Return deinVergleichsergebnis ' :) End Function Und aufgerufen wird das ganze so: Code: [AUSKLAPPEN] SortList(meineListe, True, SuperDuperVergleichsFunktion)
True = Aufsteigend, False = Absteigend |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das braucht man garnicht so aufwändig zu machen, die compare-methode ist in 3 zeilen abgehandelt:
BlitzMax: [AUSKLAPPEN] Method Compare:Int(other:Object) |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke euch.
Das ist mir auch schon aufgefallen, aber bei diesem Type benutze ich kein ListRemove um 1 Object zu löschen, daher kann ich es so lassen, es funktioniert und bis jetzt habe ich noch keinen Fehler entdeckt, außer das mit ListRemove. Ich habe das ja getestet, sobald ich irgendwo 1 Object lösche, verschieben sich die anderen Type einträge danach nach links wo ich 1 Object gelöscht hatte. Aber das spielt in dem fall keine Rolle, da ich bei diesem Type kein ListRemove benutze. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group