Types Sortieren? [Gelöst]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

bruce85

Betreff: Types Sortieren? [Gelöst]

BeitragMi, Jan 06, 2010 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jan 06, 2010 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst der Liste natürlich auch sagen, wann sie sich sortieren soll Wink

z.B. nach jedem neuen Einfügen:
BlitzMax: [AUSKLAPPEN]

Method New()
TestList.AddLast(Self)
TestList.sort()
End Method

Midimaster

BeitragMi, Jan 06, 2010 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
bei einem meiner projekte sieht das fast gleich aus und funktioniert:

BlitzMax: [AUSKLAPPEN]
; so mach ich das sortieren:
TTest.dir=1
TestList.sort

; und so sieht der Type aus:

Global TestList:TList=New TList

Type TTest
Field XAnzahl:Int
;....
Global dir%=1

Function NeuesElementAufnehmen()
Local B:TTest
B.Xanzahl=Rand(1,100)
TestList.addlast B
End Function

Method Compare:Int(otherObject:Object)
Local comp:TTest = TTest(otherObject)
If comp Then
If XAnzahl < Comp.XAnzahl Then
Return dir
ElseIf XAnzahl > Comp.XAnzahl Then
Return -dir
Else
Return 0
EndIf
EndIf
Return 0
End Method

End Type

 

bruce85

BeitragMi, Jan 06, 2010 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 08, 2010 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 09, 2010 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das braucht man garnicht so aufwändig zu machen, die compare-methode ist in 3 zeilen abgehandelt:

BlitzMax: [AUSKLAPPEN]
Method Compare:Int(other:Object) 
Local o:TTest = TTest(other)
If Not o Then Return -1
Return o.XAnzahl - XAnzahl
EndMethod
 

bruce85

BeitragMo, Jan 11, 2010 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group