Iterate through array and delete if match

  • Thread starter jackster the jackle
  • Start date
J

jackster the jackle

I'm trying to delete elements of an array if they match a string but my
code always leaves some matches and I think it's because it's having
trouble iterating through the same array it is trying to delete from, is
that true?

Here is the code:

@acl_all_array.each do |range|
if range[/access-list/]
@acl_all_array.delete(range)
puts range
end
end

Is this the correct way to delete matched entries from an array?

Thanks

John
 
T

Tim Hunter

jackster said:
I'm trying to delete elements of an array if they match a string but my
code always leaves some matches and I think it's because it's having
trouble iterating through the same array it is trying to delete from, is
that true?

Here is the code:

@acl_all_array.each do |range|
if range[/access-list/]
@acl_all_array.delete(range)
puts range
end
end

Is this the correct way to delete matched entries from an array?

Thanks

John

Use delete_if instead.
 
S

Shawn Anderson

[Note: parts of this message were removed to make it a legal post.]

I believe there is a method on Array called delete_if for just such a case..
IIRC

/Shawn

jackster said:
I'm trying to delete elements of an array if they match a string but my
code always leaves some matches and I think it's because it's having
trouble iterating through the same array it is trying to delete from, is
that true?

Here is the code:

@acl_all_array.each do |range|
if range[/access-list/]
@acl_all_array.delete(range)
puts range
end
end

Is this the correct way to delete matched entries from an array?

Thanks

John

Use delete_if instead.
 
R

Ragav Satish

Tim said:
Use delete_if instead.

Or Array#reject!

deleting while iterating with each is undefined behavior. It's like
sawing off the tree branch you are sitting on.
 
J

jackster the jackle

Or Array#reject!
deleting while iterating with each is undefined behavior. It's like
sawing off the tree branch you are sitting on.


hehehe...I know what you mean!

Tim's solution worked, I used:

@acl_all_array.each do |range|
if range[/access-list/]
@acl_range.push(range)
end
end
@acl_all_array.delete_if { |x| x[/access-list/] }

Thanks for all the help guys...I am going to read up on Array#reject! to
see how that might help me.

john
 
D

David A. Black

Hi --

Or Array#reject!

deleting while iterating with each is undefined behavior. It's like
sawing off the tree branch you are sitting on.


hehehe...I know what you mean!

Tim's solution worked, I used:

@acl_all_array.each do |range|
if range[/access-list/]
@acl_range.push(range)
end
end
@acl_all_array.delete_if { |x| x[/access-list/] }

Thanks for all the help guys...I am going to read up on Array#reject! to
see how that might help me.

Check out Array#partition too. What you've got there looks like it
could be:

@acl_all_array, @acl_range = @acl_all_array.partition do |range|
range[/access-list/]
end

or something like that.


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!
 
J

jackster the jackle

David said:
Hi --

Check out Array#partition too. What you've got there looks like it
could be:

@acl_all_array, @acl_range = @acl_all_array.partition do |range|
range[/access-list/]
end

or something like that.


good call David.....I'm going to try and incorporate that into my code.
Nice to see you on the forum! I'm still mad that my training was never
approved :-(

john
 
R

Robert Klemme

David said:
Hi --

Check out Array#partition too. What you've got there looks like it
could be:

@acl_all_array, @acl_range = @acl_all_array.partition do |range|
range[/access-list/]
end

or something like that.

And, to give you another option you can fill the second array inside the
delete_if block as well:

@acl_all_array.delete_if { |x| x[/access-list/] and
@acl_range.push(x)}

Cheers

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,737
Latest member
Georgeengab

Latest Threads

Top