Comparing Arrays


#1

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?


#2

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


#3

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

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 G. II


#4

On 4/5/06, Nathan O. removed_email_address@domain.invalid wrote:

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?

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) }


#5

On Apr 5, 2006, at 3:40 PM, Nathan O. 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.

vars_and_methods_like_this

ClassesAndModulesLikeThis

CONSTANTS_GENERALLY_LIKE_THIS # some people use the class style here
too

nothingLikeThisJavaStyle # :wink:

James Edward G. II


#6

Mark V. 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.


#7

James G. wrote:

vars_and_methods_like_this

ClassesAndModulesLikeThis

CONSTANTS_GENERALLY_LIKE_THIS # some people use the class style here
too

nothingLikeThisJavaStyle # :wink:

James Edward G. 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!