How do I use TMap?
BlitzMax Forums/BlitzMax Beginners Area/How do I use TMap?
| ||
Does anybody have any idea how to implement TMap? I'd like to create a hash, but I can't seem to use EachIn to cycle through keys nor retrieve a key with ValueForKey(string) [I just get an object cannot be converted error]. |
| ||
im using TMap for something im working on and while figuring out how to use it i wrote up this sample. based on some of the things i encountered and feel are missing im not sure if its complete yet. this based on the fact that TNode.Remove() fails an assert out of the box and that things like a NodeCount() method are not there. also, i dont see the need for TEnumer. it appears to just store a reference to the real enumerator object so my assumption is there probably more planned for it. TMap is functional as it stands.Strict Framework BRL.Basic Import BRL.Map Local themap:TMap=New TMap ' items to store in the map Type item Field val:String Function create:item(text:String) Local retval:item=New item retval.val=text Return retval EndFunction EndType ' create some items to add Local val1:item=item.create("this is test1") Local val2:item=item.create("this is test2") ' insert some nodes using a text key. you can use any object for the key, but make sure you ' properly implement the Compare() method. themap.Insert("test1",val1) themap.Insert("test2",val2) Print("") Print("-----------------------------------") Print("Enumerate Keys") Print("-----------------------------------") ' get the key enumerator Local keyenum:TKeyEnum=TKeyEnum(themap.Keys().ObjectEnumerator()) ' loop through the enumerator showing each key While keyenum.HasNext() Print(keyenum.NextObject().ToString()) Wend Print("") Print("-----------------------------------") Print("Enumerate Values") Print("-----------------------------------") ' get the key enumerator Local valenum:TValueEnum=TValueEnum(themap.Values().ObjectEnumerator()) ' loop through the enumerator showing each value for the objects of type item While valenum.HasNext() Print(item(valenum.NextObject()).val) Wend Print("") Print("-----------------------------------") Print("Enumerate Nodes") Print("-----------------------------------") Local nodeenum:TNodeEnum=themap.ObjectEnumerator() While nodeenum.HasNext() Local temp:TNode=TNode(nodeenum.NextObject()) Print("KEY: "+temp.Key().ToString()) Print("VAL: "+item(temp.Value()).val) Wend Print("") Print("-----------------------------------") Print("Is key present?") Print("-----------------------------------") ' check for test3 If Not themap.ValueForKey("test3") Then Print("test3: doesnt exist") Else Print("test3: its there") ' add test3 Local val3:item=item.create("this is test3") themap.Insert("test3",val3) ' check for test3 If Not themap.ValueForKey("test3") Then Print("test3: doesnt exist") Else Print("test3: its there") Print("") Print("-----------------------------------") Print("Getting value based on key") Print("-----------------------------------") ' find the item Local tempitem:item=item(themap.ValueForKey("test1")) ' be sure to check for null If tempitem Then Print("test1 value is: '"+tempitem.val+"'") Else Print("could Not locate test1") Print("") Print("-----------------------------------") Print("Finding TNode based on key") Print("This is a little confusing because the parameter for TMap.FindNode says 'value:Object'") Print("leading you to believe that you need to pass the value object instead of the key. It") Print("is in fact the _key_ that you need to pass.") Print("-----------------------------------") Local tempnode:TNode=themap.FindNode("test1") ' print out the key Print(tempnode.Key().ToString()) ' print out the item value Print(item(tempnode.Value()).val) Print("") Print("-----------------------------------") Print("Key based removal") Print("-----------------------------------") ' check for test2 If Not themap.ValueForKey("test2") Then Print("test2: doesnt exist") Else Print("test2: its there") ' remove the item themap.Remove("test2") ' check for test2 If Not themap.ValueForKey("test2") Then Print("test2: doesnt exist") Else Print("test2: its there") Print("") Print("-----------------------------------") Print("Node based removal (doesnt appear to be working)") Print("-----------------------------------") 'Print("removing "+tempnode.Key().ToString()) 'tempnode.Remove() ' check for test1 'If Not themap.ValueForKey("test1") Then Print("test1: doesnt exist") Else Print("test1: its there") Print("") Print("-----------------------------------") Print("Clearing the map") Print("-----------------------------------") ' remove all nodes themap.Clear() Print("") Print("-----------------------------------") Print("Checking that the map is empty") Print("-----------------------------------") ' make sure its empty If Not themap.FirstNode() Then Print("map is empty") Else Print("map is not empty") |
| ||
GMan many thanks, this really helped! Here is the simplified version of TMap. I use Strings both as objects and Strings. A bit easier to read. Otherwise it's the same as above. 'Initiate TMap Global Map:TMap = New TMap ' A D D Key$ = "Card on Hand" Map.Insert( Key , "Dimond" ) Map.Insert( Key , "Harts" )'Will overwrite "Dimond" Key$ = "Marker1" Map.Insert( Key , "Not Blue" ) Key$ = "Marker2" Map.Insert( Key , "Red" ) Key$ = "Marker1" Map.Insert( Key , "Blue" )' Write 'Blue' to Node 'Marker1' ' F I N D Key$ = "Card on Hand"' Yes the key is caSe SensItivE If Map.FindNode( Key ) Print "Key Found" Else Print "Key NOT Found" ' F I N D A L L K E Y S Print "------ All Keys in Map -------" Local n=0 For S$ = EachIn Map.Keys() n:+1 Print n+". Key in Map: "+S Next ' F I N D A L L O B J E C T S Print "------ All Objects in Map -------" n=0 For S$ = EachIn Map.Values() n:+1 Print n+". Object in Map: "+S Next ' F I N D A L L N O D E S Print "------ All Nodes in Map -------" n=0 For Node:TNode = EachIn Map n:+1 Print n+". Key : "+Node.Key().ToString() Print n+". Value: "+Node.Value().ToString() Next ' R E M O V E 'Remove key Key$ = "Marker1" Map.Remove( Key ) 'Remove A Key based on the Object/Value ObjectInQuestion$ = "Red" For Node:TNode = EachIn Map If Node.Value() = ObjectInQuestion$ Node.Remove() Next |
| ||
There are map functions? Oh man. the amount of time I could have saved if I'd just poked around. Thanks guys. |
| ||
@Wave - glad i could help :) |