[Verständnis] Linked List sortieren

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Justus

Betreff: [Verständnis] Linked List sortieren

BeitragSo, März 19, 2006 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, diesen Titel gab es schon mal und zwar in diesem Thread https://www.blitzforum.de/viewtopic.php?t=13351 , wo FDM das selbe Problem hatte wie ich.

Nun, ich habe auch eine Klasse THighscore mit den Feldern:

  • score:Int Die erreichte Punktzahl
  • player:String Der Name des Spielers
  • link:TLink


Der TLink gliedert dann mittels ListAddLast() das Objekt in die highscoreList:TList ein.

Ist es richtig, dass SortList nur funktioniert, wenn ich die TList irgendwie anders benutze? Auf jeden Fall habe ich den Eindruck, dass mir SortList() in dieser Angelegenheit nicht weiter hilft.

Der Gedanke des Sortierens ist ja, zwei Werte (hier: score) zu vergleichen. Und wenn dann vergleichen wurde, will ich das ganze Objekt eine Listenposition nach oben oder nach unten verschieben.

Doch ich weiß nicht, wie ich diesen Vergleich anstellen soll. Ich glaube ich muss die einzelnen Objekte irgendwie über ihre Links ansprechen, aber da haperts eben und ich habe keine adequate Information auftreiben können.

MFG,
Justus
 

Dreamora

BeitragSo, März 19, 2006 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die Method compare:int(other:object) implementieren in deinem Type:

Code: [AUSKLAPPEN]

method compare:int(other:object)
  local highscore:THighscore = THighscore (other)
  if self = highscore    return 0
  if score - highscore.score > 0 or ..
     (score - highscore.score = 0 and player > highscore.player)
    return 1
  endif
  return -1
end method


Return 0 darf NUR dann zurück gegeben werden, wenn man die objekte als identisch ansieht, denn Remove nutzt den Return 0 zum entscheiden ob das objekt das gesuchte ist beim löschen!
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Justus

BeitragSo, März 19, 2006 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das selbe hast du bei FDM auch geschrieben und ich habe es da schon nicht verstanden Wink

Ich möchte einfach nur wissen, wie ich auf ein anderes Objekt (z.B. auf das nächste in der Liste) verweisen kann. Mit TLinks muss das doch irgendwie gehen. Und dann die TLinks innerhalb der Liste verschieben.
 

Dreamora

BeitragSo, März 19, 2006 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das solltest du nicht.
TList is das Objekt, das für die Nutzung gedacht ist.
TLink ist ein Implementationsobjekt und es gibt ehrlich gesagt keinen sinnvollen Grund darauf zuzugreifen. Es birgt lediglich das risiko das dein gesamter Code zusammenbricht, wenn die Struktur innerhalb der LinkedList geändert wird. Deshalb wundert es mich, dass LinkedList den TLink net als private hat und auch noch firstlink und so anbietet ... ziemlicher OO Bruch.

Aber solltes du darauf bestehen: TLink.NextLink() wird dir der nächste Link ausgeben, .PrevLink() den vorhergehenden.
Code: [AUSKLAPPEN]

function moveLink(link:tlink, prev:int = false)
  local temp:tlink
  if prev
    ' wechsel mit dem vorhergehenden
    temp  = link.prevlink()
    link._prev = temp.prevlink()
    temp._succ = link.nextlink()
    link._succ = temp
    temp._prev = link
   
  else
    ' wechsel mit dem nachfolgenden
    temp = link.nextlink()
    link._succ = temp.nextlink()
    temp._prev = link.prevlink()
    temp._succ = link
    link._prev = temp

  endif
 
end function



für weitere Infos, schau ins linkedlist.mod rein
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Justus

BeitragSo, März 19, 2006 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah! Jetzt ist mir einiges klar geworden, vielen Dank.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group