Modify a object in list

BlitzMax Forums/BlitzMax Beginners Area/Modify a object in list

Trangof(Posted 2010) [#1]
Hi everione.

I created a list with 8 typeobject and every typeobject have 3 field, the question is it posible edit one field of 5th typeobect in list, por example?


SuperStrict

Global list:TList= CreateList()

Type mytype

     Field x%=0
     Field y%=1
     Field z%=2

End Type

For Local n%=1 To 8
Local newtype:mytype
newtype = New mytype
Print newtype.x 
Print newtype.y
Print newtype.z
list.addlast(newtype)
Next



I want to modify z in 5th newtype in list, is it possible?

I hope you understand, i cant explein better 'cause i began two day ago in blitmax and programing, so i mega noob.


Czar Flavius(Posted 2010) [#2]
SuperStrict

Global list:TList = CreateList()

Type mytype

	Field x%=0
	Field y%=1
	Field z%=2

End Type

For Local n% = 1 To 8
	Local newtype:mytype = New mytype
	Print newtype.x 
	Print newtype.y
	Print newtype.z
	list.AddLast(newtype)
Next

Local temp:mytype

'modify z in 5th newtype in list
temp = mytype(list.ValueAtIndex(5))
temp.z = 99

'modify z in all newtype in list
For temp = EachIn list
	temp.z = 43
Next

'modify z only if y = 1
For temp = EachIn list
	If temp.y = 1
		temp.z = 43
	End If
Next


Something to note and remember - when you use ValueAtIndex, you need to surround this with the name of your type in brackets. You don't need to do that for EachIn.

If you often need to modify only a single object in a list, and not all objects in the list, an array may be better for you.

SuperStrict

Global array:mytype[]

Type mytype

	Field x%=0
	Field y%=1
	Field z%=2

End Type

'give array size of 8
array = New mytype[8]

'an array starts at number 0 not 1, so we use positions 0-7 (still 8 in total) not 1-8
For Local n% = 0 To 7
	Local newtype:mytype = New mytype
	Print newtype.x 
	Print newtype.y
	Print newtype.z
	'place newtype into position n of the array
	array[n] = newtype
Next

Local temp:mytype

'modify z in 5th newtype in array. notice the difference
temp = array[5]
temp.z = 99

'modify z in all newtype in array. no difference to code
For temp = EachIn array
	temp.z = 43
Next

'modify z only if y = 1. no difference to code
For temp = EachIn array
	If temp.y = 1
		temp.z = 43
	End If
Next


The downside is that an array is of fixed size. You must know in advance the number of objects to add. You can resize the array later, but it will lose its old contents unless you save it in another array first.


Jesse(Posted 2010) [#3]

You can resize the array later, but it will lose its old contents unless you save it in another array first.


resizing one dimension array with slices will not loose its contents unless you are shrinking it.

Be careful what you tell the noob unless your intention is to confuse him. ;).
I am not saying he should be using slices either or not.


Midimaster(Posted 2010) [#4]
You should care about the cases, when you delete one element of the list. After this, Element no. 5 isn't longer at the 5th position (but on 4th).

A better solution is to add a Field Index% to the Type and to fill this with a counter value every time you create a new one. After deleting one element, the position of all elements has changed, but not this index value:

SuperStrict

Global List:TList= CreateList()

Type MyType
    Global Last%

     Field x%=1234
     Field y%=1
     Field z%=2
     Field Index%
 
    Function CreateNew()
        Local locType:MyType 
        locType = New MyType
        locType.Index=Last
        Last=Last+1
        List.Addlast(locType)
    End Function

End Type

; how to create some new elements:
For Local I%= 1 to 10
   MyType.CreateNew()
Next
; how to find a certain emelemt:
For locType:MyType= EachIn List
    If locType.Index=5 then
          Print locType.X
    Endif
Next



A much more elegant way to do this is to integrate the search fuction into the TYPE:
SuperStrict
Global List:TList= CreateList()

Type MyType
    Global Last%

     Field x%=1234
     Field y%=1
     Field z%=2
     Field Index%
 
    Function CreateNew()
        Local locType:MyType 
        locType = New MyType
        locType.Index=Last
        Last=Last+1
        List.Addlast(locType)
    End Function

    Function Element:MyType(Nr%) 
        For Local locType:MyType= EachIn List
            If locType.Index=Nr Then 
                Return locType
            Endif
        Next
     End Function 

End Type

' how to create some new elements:
For Local I%=1 to 10
      MyType.CreateNew()
Next

' how to find a certain emelemt:
Print MyType.Element(5).X



Czar Flavius(Posted 2010) [#5]
Oh dear that will probably confuse him.. I wouldn't encourage use of lists in that way just to find one element.


Trangof(Posted 2010) [#6]
Thanx for your time. I tried every example and I understand. Very useful for me.

Great community !!!