Liste After?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Liste After?

BeitragMo, Nov 10, 2014 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
hi ich stecke an einem kleinen problem fest, und zwar geht es darum ein eintrag in einer liste zu bekommen zwischen 2 objekten.

z.b.
Code: [AUSKLAPPEN]
Global PlayerList:TList = New TList

Type TPlayer
   Field Name:String, Punkte:Int
End Type

Function ADD_Player (Name:String, Punkte:Int)
   Local P:TPlayer = New TPlayer
   P.Name = Name
   P.Punkte = Punkte
   PlayerList.AddLast P
End Function

ADD_Player ("Spieler 1", 10)
ADD_Player ("Spieler 2", 10)
'-<<<<<<<<<<<<<<<<<<<< Hier soll später z.b. Player 3 rein...
ADD_Player ("Spieler 4", 10)



ich brauche dies weniger für player und score ehr für eine textarea...
dies bsp soll nur zur ansicht dienen...

also in der liste vom code oben steht nun spieler 1, spieler 2 und spieler 4 .... aber was ist wenn man im nachhinein spieler 3 zwischen spieler 2 und 4 einbringen möchte? zu blitzbasic zeiten war es meines wissen nach after & before ... wie nun?
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

BladeRunner

Moderator

BeitragMo, Nov 10, 2014 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Liste komplett neu erstellen, anders geht es nicht. Du könntest auch händisch die Tlink-Objekte ändern, aber idR. wird ein neuerstellen der Liste schneller und einfacher sein.
Das geht in Ordnung wenn nur selten ein Objekt gezielt eingefügt werden muss. Ansonsten ist TList nicht Mittel der Wahl.
Je nachdem was du vorhast könnte eventuell eine TMap was für dich sein, das ist ein binärer Baum.

Wenn es Dir um eine Reihenfolge geht könntest Du die Liste auch mittels list.sort() ordnen lassen, dann musst du allerdings eine passende Compare-Funktion schreiben.
Diese kann dann ein Feld deines Types als Ordnungskriterium verwenden (zB eine ID).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Mathias-Kwiatkowski

BeitragMo, Nov 10, 2014 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
jo an compare habe ich zuerst gedacht aber ich denke dann wird neu erstellen auch meine wahl werden... (da es ja nur neu erstellt werden muss wenn man im textarea "enter" drückt.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

BladeRunner

Moderator

BeitragMo, Nov 10, 2014 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es für eine Textarea ist wäre vielleicht das gute alte Array die beste Variante. Arrayinhalte austauschen geht ja recht fix, und on-the-fly redimensionieren ist auch kein Problem.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragDi, Nov 11, 2014 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch doch, so eine Funktion gibt es eh, nur nicht als globale Funktion sondern als Methode:

TList.insertBeforeLink / TList.insertAfterLink
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragDi, Nov 11, 2014 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war es was ich mit Du könntest auch die TLink-Objekte Händisch ändern meinte. Immerhin muss man ja erst mal den Link erlangen, dann einfügen. Ist also machbar, aber mit Mehraufwand verbunden. Ich bleibe aber dabei: Bei einer Textarea wäre ein Array Mittel der Wahl.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

BladeRunner

Moderator

BeitragDi, Nov 11, 2014 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
SuperStrict

Type TListExt Extends TList
   Method After(obj:Object , value:Object)
      Local link:TLink = Self.FindLink(obj:Object)
      Self.InsertAfterLink(value , link)
   End Method
   Method Before(obj:Object , value:Object)
      Local link:TLink = Self.FindLink(obj:Object)
      Self.InsertBeforeLink(value , link)
   End Method
End Type

Local list:TListExt = New TListExt
list.addlast("bla")
list.addlast("blubb")
list.After("bla" , "bazong")

For Local s:String = EachIn list
   Print s
Next


Hier ein kleines Beispiel wie man das mit einer erweiterten Klasse lösen kann.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragDi, Nov 11, 2014 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, so ist es wohl am Besten gelöst. Wenn man eine Struktur hat, durch die man üblicherweise nur durchiteriert (also nicht direkt Element X haben will), die sich oft ändert, dann ist eine LinkedList genau das Richtige.

Das Einfügen in ein Array ist vergleichsweise recht aufwändig, da man hier jedes Mal quasi das ganze Array neu schreiben muss. Dafür hat man schnelleren Direktzugriff auf einzelne Objekte nach Index.

Eine Map wäre hier völlig fehl am Platz, soweit ich das Problem verstehe, da sie keine Ordnung/Reihenfolge behält. Auch kann man nicht direkt über die Map iterieren, sondern müsste erst z.B. eine Liste von Schlüsseln erstellen, über die man dann iteriert. Eine Map lässt sich zwar mit binären Bäumen realisieren, wird aber viel häufiger mit einer Hashtabelle (Hashmap) gemacht. Maps sind sehr gut, wenn man direkten Zugriff über einen Namen/Key braucht. Dort sind sie sehr schnell, alles andere können sie dafür nur mit Workarounds über andere Datenstrukturen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group