sorting-in-ruby-step-by-step
Sorting is always a great question in each language. Sometime it will become pain if we don’t know the power given by the language we are using. Ruby is great in terms of the power and easy given to developer.
Ruby has power full ways of sorting. Lets have a array that we want to sort.
["a", "aaaa", "bb", "bbbb", "bbb", "b", "cc", "c"]
Do the simple sorting for the given array
array_to_sort = ["a", "aaaa", "bb", "bbbb", "bbb", "b", "cc", "c"]
p array_to_sort.sort # => ["a", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc"]
how to do reverse sort now? think. 1st sort than reverse…?
p array_to_sort.sort.reverse
# => ["cc", "c", "bbbb", "bbb", "bb", "b", "aaaa", "a"]
We have better solution for the
use spaceship operator <=>
p array_to_sort.sort{|one,two| two<=>one}
# => ["cc", "c", "bbbb", "bbb", "bb", "b", "aaaa", "a"]
What if want to sort by length of the elements in word.
p array_to_sort.sort{|one,two|one.length <=>two.length}
# => ["a", "b", "c", "cc", "bb", "bbb", "aaaa", "bbbb"]
This is ok till we want only length but we want to sort it by alphabatically too.
p array_to_sort.sort_by {|element| [element,element.length]}
# => ["a", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc"]
Sorting the Hash
in ruby. Hashes are great for data representaions.
For example we have one complex hash of people
people = {
:fred => { :name => "Fred", :age => 23 },
:zade => { :name => "Joan", :age => 18 },
:jone => { :name => "Pete", :age => 54 }
}
p people.sort # => [[:fred, {:name=>"Fred", :age=>23}], [:jone, {:name=>"Pete", :age=>54}], [:zade, {:name=>"Joan", :age=>18}]]
What just happend my hash
changed into array
what do i do now? No worries change array to hash again using to_h
.
p people.sort.to_h
# => {:fred=>{:name=>"Fred", :age=>23}, :jone=>{:name=>"Pete", :age=>54}, :zade=>{:name=>"Joan", :age=>18}}
Is there a better way for more complex sortings? yes, there is look here is saviour sort_by
people.sort_by { |k, v| v[:age] }.to_h
# => {:zade=>{:name=>"Joan", :age=>18}, :fred=>{:name=>"Fred", :age=>23}, :jone=>{:name=>"Pete", :age=>54}}