Brian Candler <B.Candler / pobox.com> wrote in message news:<20030701112013.A20127 / linnet.org>...
> 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,
> }
>
Sorry about that!! but you got the right idea!!
> 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)
Arrg I did tried this and the to_a approach but i forgot something way
too simple! if myhash.sort {|x,y| x[1] <=> y[1]} does return the
sorted array but doesn't actually affects the given array so I have to
assign the returned value to the hash I'm using, how come I miss it!!!
all the problem was here!!
Yes I want it sorted by descending values not alphabetical
[["Shazna", 2],["Zone", 2],["Ayumi Hamasaki", 1], ["L'Arc~en~ciel",
1], ["Two-Mix", 1]]
>
> 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]]
>
yes values become keys and keys values, that's why it was "working"
but eliminating some new keys ie duplicated ones. doing a reverse then
converting to an array meaned that I could easily get it sorted as I
wanted but I would lose elements because of key duplicates, which its
my fault for not considering that a lot of the values are identical.
> Regards,
>
> Brian.
well thanks!! now it works and sorry for a not so clear post.