eigene Listentypes (mit ArrayList-Beispiel)
Übersicht
BlitzMax, BlitzMax NG
Codearchiv & Module
|
Betreff: eigene Listentypes (mit ArrayList-Beispiel)
|
Fr, Dez 25, 2009 1:47
Antworten mit Zitat
|
Vielleicht hat jemand von euch schon einmal mit dem Gedanken gespielt, einen eigenen Listentype zu schreiben, und hat es aber dann aufgegeben, weil er nicht herausgefunden hat, wie man diese Listen einfach mit "EachIn" durchgehen kann.
Ich selbst habe aber im Modulcode von BlitzMax eine Lösung gefunden, wie man eigene Types iterierbar macht.
Damit eine eigene Liste mit "EachIn" durchgegegangen werden kann, muss es einen dazu Passenden Enumerator-Type geben und beide Types müssen sich an diese Vorlage halten:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN] Type TIterable Abstract Method ObjectEnumerator:TEnumerator() Abstract EndType
Type TEnumerator Abstract Method HasNext:Int() Abstract Method NextObject:Object() Abstract EndType
(Es muss nicht von den abstrakten Types, die ich selbst geschrieben habe, geerbt werden, auch wenn es ein besserer Codingstil wäre.)
Am Besten zeige ich ein Beispiel, dass selbst eigentlich einen eigenen Platz im Codearchiv verdient hätte:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN] SuperStrict Framework brl.Blitz Import brl.Math Import brl.StandardIO
Type TEnumerator Abstract Method HasNext:Int() Abstract Method NextObject:Object() Abstract EndType
Type TIterable Abstract Method ObjectEnumerator:TEnumerator() Abstract EndType
Local List:TArrayList=TArrayList.Create()
For Local Z:Int=0 Until 10 List.Add(String(Z)) Next
For Local s:String=EachIn(List) Print s Next Print List.Add("S",2) For Local s:String=EachIn(List) Print s Next Print List.Remove(3) For Local s:String=EachIn(List) Print s Next Print Print String(List.Value(3)) End
Type TArrayList Extends TIterable Field _Array:Object[] Field _Count:Int=0 Field _Locked:Int=0 Field _ResizeFactor:Double Field _ShrinkFactor:Double Method New() Private EndMethod
Function Create:TArrayList(Size:Int=32,ResizeFactor:Double=1.5,ShrinkFactor:Double=0.5) If ResizeFactor<=1 Then Return Null If ShrinkFactor>=1 Then Return Null If ShrinkFactor*ResizeFactor>1 Then Return Null Local ArrayList:TArrayList=New TArrayList ArrayList._Array=New Object[Size] ArrayList._ResizeFactor=ResizeFactor ArrayList._ShrinkFactor=ShrinkFactor Return ArrayList EndFunction
Method Add:Int(Value:Object,ID:Int=-1) If ID>Self._Count Then Return -1 If ID<-1 Then Return -1 If ID=-1 ID=Self._Count EndIf Self._Count:+1 If Self._Count>Self._Array.length Self._Array=Self._Array[..Ceil(Self._Array.length*Self._ResizeFactor)] EndIf For Local FromID:Int=Self._Count-2 To ID Step -1 Self._Array[FromID+1]=Self._Array[FromID] Next Self._Array[ID]=Value Return ID EndMethod
Method Remove:Int(ID:Int) If ID>=Self._Count Then Return False If ID<0 Then Return False Self._Array[ID]=Null For Local FromID:Int=ID+1 Until Self._Count Self._Array[FromID-1]=Self._Array[FromID] Next Self._Count:-1 Self.ShrinkCheck() Return True EndMethod
Method ShrinkCheck:Int() If Self._Locked=0 If Self._Count<Floor(Self._Array.length*Self._ShrinkFactor) Self._Array=Self._Array[..Ceil(Self._Array.length/Self._ResizeFactor)] Return True EndIf EndIf Return False EndMethod
Method Lock() Self._Locked:+1 EndMethod
Method UnLock:Int() Self._Locked:-1 If Self._Locked<0 Then Self._Locked=0 Return Self.ShrinkCheck() EndMethod
Method Count:Int() Return Self._Count EndMethod
Method Value:Object(ID:Int) If ID>=Self._Count Then Return Null If ID<0 Then Return Null Return Self._Array[ID] EndMethod
Method ObjectEnumerator:TArrayListEnum() Return TArrayListEnum.Create(Self) EndMethod EndType
Type TArrayListEnum Extends TEnumerator Field _ArrayList:TArrayList Field _ID:Int=0 Function Create:TArrayListEnum(ArrayList:TArrayList) Local Enum:TArrayListEnum=New TArrayListEnum Enum._ArrayList=ArrayList Return Enum End Function Method HasNext:Int() If Self._ID<_ArrayList._Count Then Return True Return False End Method Method NextObject:Object() Local value:Object=_ArrayList._Array[Self._ID] Self._ID:+1 Return value End Method EndType
So...
Jetzt bin ich auf eure Kommentare gespannt.
mfG
mpmxyz
Edit: Ja, ich habe den BlitzMax-Hilfeeintrag überlesen; die Hilfe könnte meiner Meinung nach aber auch ein bischen übersichtlicher sein...
|
|
-
Zuletzt bearbeitet von mpmxyz am Fr, Dez 25, 2009 12:46, insgesamt einmal bearbeitet
|
|
Fr, Dez 25, 2009 10:43
Antworten mit Zitat
|
Das wird übrigens in der BlitzMax - Hilfe unter "Language Reference -> Collections" erklärt
|
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
|
|
|
Fr, Dez 25, 2009 12:43
Antworten mit Zitat
|
Oh, da war ich wohl etwas müde gewesen...
Naja, dann überlest mal diesen inhaltlichen Fehler und kommentiert nur noch die ArrayList.
Weitere Funktionen werde ich da wahrscheinlich noch hinzufügen.
mfG
mpmxyz
|
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
|
Übersicht
BlitzMax, BlitzMax NG
Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group