Forum: Ruby Comparing Arrays

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Nathan O. (Guest)
on 2006-04-05 20:44
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?
Matthew M. (Guest)
on 2006-04-05 20:58
(Received via mailing list)
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
James G. (Guest)
on 2006-04-05 20:58
(Received via mailing list)
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

;)

James Edward G. II
Mark V. (Guest)
on 2006-04-05 21:29
(Received via mailing list)
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) }
Nathan O. (Guest)
on 2006-04-06 00:40
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.
James G. (Guest)
on 2006-04-06 00:51
(Received via mailing list)
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  # ;)

James Edward G. II
Nathan O. (Guest)
on 2006-04-06 01:08
James G. wrote:
> vars_and_methods_like_this
>
> ClassesAndModulesLikeThis
>
> CONSTANTS_GENERALLY_LIKE_THIS  # some people use the class style here
> too
>
> nothingLikeThisJavaStyle  # ;)
>
> 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!
This topic is locked and can not be replied to.