```Hi,

I think it's generally better to open a new thread if you've got a new
question. Then we don't have to sort out the old postings.

Craig Law wrote in post #1064927:
> Has anyone got any suggestions on how I can achieve an ordered array
> that looks like this ...
>
> [[1, 3, "X","20120609"], [2, 3, "X","20120610"], [3, 3, "X","20120611"],
> [1, 2, "X","20120612"], [2, 2, "X","20120613"], [3, 2, "X","20120614"],
> [1, 1, "X","20120615"], [2, 1, "X","20120616"], [3, 1, "X","20120617"]]
>
> Many thanks
>
> Craig

The "sort" method lets you supply a block. The elements will be passed
to the block two at a time and compared according to the return value
(which is supposed to be either -1, 0 or 1, following the logic of the
<=> method).

If this case, you first compare the x coordinates. If they're different,
then the result of the comparison is the overall result. If they're the
same, you compare the values by the y coordinates (in reverse order):

#---------------

hash1 = {
[1, 3] => ["X","20120609"],
[3, 3] => ["X","20120610"],
[2, 1] => ["X","20120611"],
[1, 2] => ["X","20120612"],
[3, 2] => ["X","20120613"],
[3, 1] => ["X","20120614"],
[1, 3] => ["X","20120615"],
[2, 1] => ["X","20120616"],
[2, 2] => ["X","20120617"]
}
sorted_keys = hash1.keys.sort do |(x1, y1), (x2, y2)|
x_comparison = x1 <=> x2
if x_comparison != 0
x_comparison
else
y2 <=> y1  # note the reverse order
end
end

p sorted_keys

#---------------

You may also shorten the block content to

[x1 <=> x2, y2 <=> y1].find &:nonzero?

This will select the first of the two comparisons which is not 0.

--
Posted via http://www.ruby-forum.com/.

```