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