Reply to topic  [ 2 posts ] 
Truncating an array 
Author Message

Joined: 2007-04-12 14:59:36
Posts: 229
Still awaiting that handbook with lots of examples may I ask another elementary question or two:

In an array with 5 values, how can I truncate the first/last 2?
How can I delete values from an array that contain string $string?


2010-06-08 08:36:40
Profile
Official Nisus Person
User avatar

Joined: 2002-07-11 17:14:10
Posts: 4251
Location: San Diego, CA
js wrote:
In an array with 5 values, how can I truncate the first/last 2?

There are two ways to remove values from an array, either one value at a time, or by removing a whole range all at once. If you want to remove them one at a time, simply remove the first element twice. Just be careful because removing the first value shifts all the other indexes down:
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')
$names.removeValueAtIndex(0) # removes 'Arya' and shifts all entries down, so 'Baratheon' is now at index 0
$names.removeValueAtIndex(0) # removes 'Baratheon'

If you wanted to do it all at once:
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')
$deleteRange = Range.new(0,2)
$names.removeValuesInRange($deleteRange)

Removing the last two values is the same, just with different indexes. Of course, mostly one doesn't know how many values are in an array, so we have to calculate the index using the array's count:
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')
$count = $names.count
If $count > 1 # the array must have at least two values to remove!
   $deleteRange = Range.new($count - 2, 2)
   $names.removeValuesInRange($deleteRange)
End

In all this, there is another strategy. Rather than deleting parts of the array, we could just extract a subset of the original array. Whether or not this is useful depends on your macro's code/situation, but I'll show it here just in case. Again, removing the last two entries:
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')
$count = $names.count
If $count > 1
   $subRange = Range.new(0, $count - 2)
   $names = $names.subarrayInRange($subRange)
End

You could also assign the subarray to a new variable, keeping the original/full array intact.

Quote:
How can I delete values from an array that contain string $string?

You'll need to inspect all values in the array, and for each one, if some condition is met, remove that value from the array. The trick is to keep in mind that removing a value from an array changes the indexes of all values that come after it. So the easiest is to just process the array back to front, that way you don't have to worry about the indexes changing.

This example will remove all names containing the letter 'e':
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')

$index = $names.count - 1
While $index >= 0
   $name = $names[$index]
   # check if the value should be removed
   If $name.rangeOfString('e', 'i')
      $names.removeValueAtIndex($index)
   End
   $index -= 1 # move to the previous index/value
End

You can see the 'i' option is given to "rangeOfString", so that the match is case insensitive. You might want to get fancier and match using PowerFind/regex expressions. If so, one can use the "find" command. Here's an example that removes all names ending in a vowel:
Code:
$names = Array.new('Arya', 'Baratheon', 'Clegane', 'Dany', 'Eddard')

$index = $names.count - 1
While $index >= 0
   $name = $names[$index]
   # check if the value should be removed
   If $name.find('[aeiou]$', 'Ei')
      $names.removeValueAtIndex($index)
   End
   $index -= 1 # move to the previous index/value
End


2010-06-08 09:23:33
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 2 posts ] 

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software