Re: sorting an array based on two attributes of objects

Michael Wang
Mon, 26 Mar 2007 13:24:33 -0000

senthil wrote:
> Hi all,
>      I want to sort the objects of array based on two attributes.I want
> sort an employee class based on his salary and name , so that if two
> person has same salary it should be sorted with name.
>      Lets say for example the employee objects has following name and
> salary.
>
>          name      salary
>            d        100
>            c        200
>            b        50
>            a        100
>
>
>      so in this case the result which i expect is
>
>          name      salary
>            c        50
>            a        100
>            d        100
>            b        200
>
>   Note:In the above example for salary 100 the sorting is done
> alphabetically, but initially(before sorting) ''d'' came
first and then
> ''a'' came.so basically i want to sort the array with more
than one order.
>   Can any one help me to solve it ??
>

Use sort_by and have it return an array of the two objects you want sorted:

[26]irb
irb(main):001:0> myarray = [{:name => "d", :salary => 100},
{:name =>
"c", :salary => 200}, {:name => "a", :salary =>
100}]
=> [{:salary=>100, :name=>"d"}, {:salary=>200,
:name=>"c"},
{:salary=>100, :name=>"a"}]
irb(main):002:0> myarray.sort_by {|h| [h[:salary], h[:name]] }
=> [{:salary=>100, :name=>"a"}, {:salary=>100,
:name=>"d"},
{:salary=>200, :name=>"c"}]


--
Michael Wang