Hi --

On Thu, 23 Nov 2006, Gabriele Marrone wrote:

>
> On 23/nov/06, at 02:04, Daniel N wrote:
>
>> I want to check to see if two arrays contain the same values.
>> That is, are they the same array but not in the same order.
>
> def are_these_arrays_equal?(a1, a2)
>   return false if a1.size != a2.size
>   a2 = a2.dup # a2 will be modified, so let's duplicate it
>   for i1 in a1
>     return false unless a2.include? i1
>     # need to delete just the *first* occurrence of i1 in a2
>     # (Array#delete deletes them all)
>     found = false
>     a2.delete_if {|i2| found = !found && i1 == i2 }
>   end
>   # a2 is now empty, since its size was equal to a1 size
>   return true
> end
>
> This should work with multiple occurrences of the same object, different 
> objects (so different object_id) that seem to be equal (by comparing them 
> with ==), nil values (#find() is a bit tricky), objects that do not respond 
> to <=>.
> Did I miss any case?

It passes all of my tests (see my other email).

> Anyway I think it's a bit slow (delete_if goes on even if we deleted the only 
> one we wanted to, moreover it duplicates a whole array), but who cares? We're 
> using ruby, we probably aren't looking for speed anyway :P

Well... we don't complain when things are faster :-)  Doing a few
benchmarks it appears that yours is faster than mine.  I added a
"return false if [sizes differ]", and that helped with those runs.


David

-- 
                   David A. Black | dblack / wobblini.net
Author of "Ruby for Rails"   [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog)        [2] | Co-director, Ruby Central, Inc.   [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com    | [4] http://www.rubycentral.org