On 23/nov/06, at 03:14, Gabriele Marrone wrote:

>   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?

I'm replying to myself.

Morton smartly pointed out that elements can be arrays themselves.  
So, should we treat them as any other kind of object and compare them  
with ==?
I guess we should want to recursively apply our equality concept  
given by the OP.
So I modified my version:

   def are_these_arrays_equal?(a1, a2)
     return false unless a1.kind_of? Array and a2.kind_of? Array
     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.any? do |i2|
         if i1.kind_of? Array
           are_these_arrays_equal?(i1, i2)
         else
           i1 == i2
         end
       end
       # need to delete just the *first* occurrence of i1 in a2
       # (Array#delete deletes them all)
       found = false
       a2.delete_if do |i2|
         break if found # breaks if already deleted
         found = !found && if i1.kind_of? Array
           are_these_arrays_equal?(i1, i2)
         else
           i1 == i2
         end
       end
     end
     # a2 is now empty, since its size was equal to a1 size
     return true
   end

Of course this would be much simpler if we were redefining Array#==  
with this algorythm (there would be no need to check #kind_of?) but I  
really DON'T want to know what could happen by redefining Array#==,  
since every library could rely on it :P
(Actually, it might be funny to find out)

--
Gabriele Marrone