Axel Etzold wrote:
> Dear all,
> 
> I have many arrays like
> 
> a=[{'a',10,'b',3},{'a',10,'b',4},{'a',5,'b',13},{'a',13,'b',13},
> {'a',10,'b',7},{'a',5,'b',3}]
> 
> which I'd like to sort such that I get the hashes with the highest
> values of 'a' first. If there are ties, I'd like to sort them (but not
> the entire array) such
> that the highest values of 'b' come first.
> So I can't just sort for 'a'-values first and then for 'b'-values,
> as this would destroy the first sort order.
> 
> Is there a built-in way of getting the ties in sorting, such as an
> Array of the results of the <=> comparisons ?
> 
> Thank you!
> 
> Best regards,
> 
> Axel

Built in? I don't know about that, but it's pretty easy. I'm sure your 
real situation is more complex than the example you gave, but I really 
think this is the easiest way (and you can avoid making comparisons 
twice by caching the value of hash1['a'] <=> hash2['a'], if you wish):

a=[{'a',10,'b',3},{'a',10,'b',4},{'a',5,'b',13},{'a',13,'b',13},
{'a',10,'b',7},{'a',5,'b',3}]
a.sort do |hash1, hash2|
   if hash1['a'] == hash2['a']
     hash1['b'] <=> hash2['b']
   else
     hash1['a'] <=> hash2['a']
   end
end

The above is essentially a redefinition of <=> on hashes with elements 
"a" and "b". The only thing you need to be sure of is that ordering is 
strict--that you never have x < y < z but z < x. That should be no 
problem if you only try to break ties.

Hope this helps,
Dan