array insert remove

BlitzMax Forums/BlitzMax Beginners Area/array insert remove

Bremer(Posted 2006) [#1]
What is the easiest method of inserting and removing a value from an array?

Eg. I have an array of x number of values, and now I want to add one and have the array dimension grow, or I want to remove one and have the array dimension shrink.

[edit] forgot to mention that I want to add and remove values not just from the start and end of the array, but anywhere within the array. Otherwise slices should be good enough.


tonyg(Posted 2006) [#2]
There's a post from about a year ago where Mark suggested using listfromarray and back again in certain conditions and, in others, using a temp array.
Can't find it now and can't think what search to use.


FlameDuck(Posted 2006) [#3]
What is the easiest method of inserting and removing a value from an array?
Use lists.


Bremer(Posted 2006) [#4]
You're probably right, seems like the only way to do it is with lists, unless I want the overhead of creating temporary arrays and do some for/next loops. So I'll take a look at changing my code to utilize lists instead.


Perturbatio(Posted 2006) [#5]
http://www.blitzbasic.com/codearcs/codearcs.php?code=1501


Bremer(Posted 2006) [#6]
Not sure why I didn't spot that one. I will take a look at it, thanks Pertubatio.


Perturbatio(Posted 2006) [#7]
np :)


Bremer(Posted 2006) [#8]
I have made a function to insert a value into an array. It should be easy to convert it into float and other types of arrays. Thanks for the inspiration of your functions, now I can both remove and add values from within arrays.

Local a:Int[] = [0,1,2,3,4,6,7,8,9]

Print "Before: "+Len(a)+" fields"
For Local b:Int = 0 To 8
	Print a[b]
Next

a = insertIntoIntArray( a[..], 5, 5 )

Print "After: "+Len(a)+" fields"
For Local c:Int = 0 To 9
	Print a[c]
Next

Function insertIntoIntArray:Int[](Array:Int[],index:Int,value:Int)
	Local remain:Int = (Len(array)) - index
	Local result:Int[Len(array)+1]
	For Local count:Int = 0 To index-1	' copy all values before insert
		result[count] = Array[count]
	Next
	result[index] = value				' insert value
	For Local count2:Int = 0 To remain-1	' copy remaining values after insert
		result[index+count2+1] = Array[index+count2]
	Next
	Return result
End Function



tonyg(Posted 2006) [#9]
zawran, check the length of your array before and after. Something is going wrong somewhere.
I think it's the use of sizeof. Use len(array) instead.
Also best to use...
For Local d:Int = EachIn a
	Print d
Next

rather than a count field especially after using slices.


Bremer(Posted 2006) [#10]
You are correct. Using sizeof was a mistake. I have changed it to use len() and it should be working correctly now.

I cannot use EachIn because I need to copy data from the beginning to an index and from the index to the end. EachIn would give me the entire array, or have I misunderstood something about the EachIn command?


tonyg(Posted 2006) [#11]
If you use the for x = 0 to 9 method and there are not you can get spurious values as it reads beyond the end of the array.
This the code I came up with...
Strict
Local a:Int[] = [0,1,2,3,4,6,7,8,9]

Print "Before:"
For Local b:Int = EachIn a
	Print b
Next
Print "Length : " + Len(a)
a = insertIntoIntArray( a, 5, 5 )
Print "Insert:"
For Local c:Int = EachIn a
	Print c
Next
Print "length : " + Len(a)

a = removefromintarray(a,5)
Print "Remove:"
For Local d:Int = EachIn a
	Print d
Next
Print "length : " + Len(a)


Function insertIntoIntArray:Int[](Array:Int[],index:Int,value:Int)
	Local remain:Int = (Len(array)+1) - index
	Local result:Int[Len(array)+1]
	For Local count:Int = 0 To index-1	' copy all values before insert
		result[count] = Array[count]
	Next
	result[index] = value				' insert value
	For Local count2:Int = 0 To remain-1	' copy remaining values after insert
		result[index+count2+1] = Array[index+count2]
	Next
	Return result
End Function
Function removefromintarray:Int[](array:Int[],index:Int)
    Local result:Int[Len(array)-1]
    Local remain:Int=index+1
    For Local count:Int = 0 To index-1
        result[count] = array[count]
    Next
    For Local count:Int = index+1 To Len(result)
       result[count-1] =  array[count]
    Next
    Return result
End Function

Any improvements let me know.


Bremer(Posted 2006) [#12]
Ah , you ment the code I had to test the functions with. I thought you were talking about the loop code within the functions. Then it all makes sense :)


Diablo(Posted 2006) [#13]
using slices ( cant think how to copy from x to y and retian the prevision values )



tonyg(Posted 2006) [#14]
I thought about using slices but thought it'd be quicker to create the array the right size to begin with rather than resize it. Not sure it matters.
When I tried to use slices to copy the remaining values I got '0'. Might have done something wrong but that's when I used the other method.