On Tue, Jul 01, 2003 at 07:07:55PM +0900, Osuka wrote:
> I'm Having some trouble sorting a hash!, the hash contents are like
> this:
> 
> 1 is Ayumi Hamasaki
> 2 is Zone
> 1 is Two-Mix
> 2 is Shazna
> 1 is L'arc~en~ciel

I don't understand. Firstly, do you mean that your hash is like this:

  myhash = {
	'Ayumi Hamasaki' => 1,
	'Zone' => 2,
	'Two-Mix' => 1,
	'Shazna' => 2,
	'L\'Arc~en~ciel' => 1,
  }

Secondly, how do you want to sort it? If you just do

   myhash.sort

then you will get it sorted alphabetically by the key, i.e.

=> [["Ayumi Hamasaki", 1], ["L'Arc~en~ciel", 1], ["Shazna", 2],
    ["Two-Mix", 1], ["Zone", 2]]

If you want to sort it by the numeric value, then you can pass in an
explicit block which shows how to compare the values:

  myhash.sort {|x,y| x[1] <=> y[1]}

=> [["Ayumi Hamasaki", 1], ["L'Arc~en~ciel", 1], ["Two-Mix", 1],
    ["Shazna", 2], ["Zone", 2]]

(you can see all the 1's come before the 2's)

Essentially the thing to remember is: when you sort a hash, it first gets
converted to an array, where each element is a two-element array of
[key,value] pairs.

You can do this conversion yourself explicitly:

  myhash.to_a

> Problem is: I want to ordered it in a descending order but using
> Hash.invert I lose data 'cos there can't be several keys that are the
> same, so any ideas of how to do this

By descending order of what?

Hash.invert doesn't reverse the order of elements, it swaps the keys and the
values!! If you want a reverse alphabetical sort, try:

  myhash.sort.reverse

=> [["Zone", 2], ["Two-Mix", 1], ["Shazna", 2], ["L'Arc~en~ciel", 1],
    ["Ayumi Hamasaki", 1]]

Regards,

Brian.