Comparing Arrays

I have two arrays: originalList and deleteList. I'm trying to iterate
through original list and remove each item if it appears in the
deleteList. Simple enough. Here's my snippet for doing this:

originalList.each do |item|
  if deleteList.include?(item)
    puts "Deleting " + item
    originalList.delete(item)
  end
end

Unfortunately, this code doesn't seem to be doing what I think it
should. It seems to skip some items in originalList. I can provide
examples upon request. Is there anything wrong with my algorithm?

···

--
Posted via http://www.ruby-forum.com/.

I would think that trying to remove items from the list you are
enumerating is generally a bad thing... I don't know enough about Ruby
internals to know whether that applies to Ruby, but I generally avoid
it.

Might you want this:

originalList = originalList - deleteList

I have two arrays: originalList and deleteList.

Just FYI, the Ruby naming convention is to make those original_list and delete_list.

I'm trying to iterate
through original list and remove each item if it appears in the
deleteList. Simple enough.

Sure is, try:

   original_list - delete_list

:wink:

James Edward Gray II

···

On Apr 5, 2006, at 11:44 AM, Nathan Olberding wrote:

I got bit by something similar this past weekend. It turns out that
Array#delete deletes based on == comparisons (generally means two
objects are from the same class and have the same instance variable
values), not eql? comparisons (means same object) as I had guessed.
That can be a significant difference. For one thing it allows the
delete method to delete more than one object from the array. If you
want to delete a specific object based on its identity, as far as I
know you need to do it like this.

obj_to_delete = whatever
my_array.delete_if { |obj| obj.eql?(obj_to_delete) }

···

On 4/5/06, Nathan Olberding <nathan.olberding@gmail.com> wrote:

I have two arrays: originalList and deleteList. I'm trying to iterate
through original list and remove each item if it appears in the
deleteList. Simple enough. Here's my snippet for doing this:

originalList.each do |item|
        if deleteList.include?(item)
                puts "Deleting " + item
                originalList.delete(item)
        end
end

Unfortunately, this code doesn't seem to be doing what I think it
should. It seems to skip some items in originalList. I can provide
examples upon request. Is there anything wrong with my algorithm?

--
R. Mark Volkmann
Object Computing, Inc.

Mark Volkmann wrote:

I got bit by something similar this past weekend. It turns out that
Array#delete deletes based on == comparisons (generally means two
objects are from the same class and have the same instance variable
values), not eql? comparisons (means same object) as I had guessed.
That can be a significant difference. For one thing it allows the
delete method to delete more than one object from the array. If you
want to delete a specific object based on its identity, as far as I
know you need to do it like this.

obj_to_delete = whatever
my_array.delete_if { |obj| obj.eql?(obj_to_delete) }

That sounds like something not many people would assume, and therefor
maybe something that might be reviewed before 2.0... but anyways!

The list1 - list2 way of doing this worked wonders. Funny, I used this
two weeks ago, the last time I hacked on this script, and had completely
forgotten about it. Many thanks to everyone!

As an aside, is_this the ruby naming convention, orThis? All the
references I've seen on the web useThis. Either is fine, I'm just
wondering now that it's been brought up.

···

--
Posted via http://www.ruby-forum.com/\.

vars_and_methods_like_this

ClassesAndModulesLikeThis

CONSTANTS_GENERALLY_LIKE_THIS # some people use the class style here too

nothingLikeThisJavaStyle # :wink:

James Edward Gray II

···

On Apr 5, 2006, at 3:40 PM, Nathan Olberding wrote:

As an aside, is_this the ruby naming convention, orThis? All the
references I've seen on the web useThis. Either is fine, I'm just
wondering now that it's been brought up.

James Gray wrote:

vars_and_methods_like_this

ClassesAndModulesLikeThis

CONSTANTS_GENERALLY_LIKE_THIS # some people use the class style here
too

nothingLikeThisJavaStyle # :wink:

James Edward Gray II

Seems you're right! I was looking at documentation for 1.6. Everything
I'm finding for 1.8 is_this_way.

Wonderful. I'll try to remember that for my *next* project!

···

--
Posted via http://www.ruby-forum.com/\.