Use sort_by http://rubydoc.info/stdlib/core/1.9.3/Enumerable#sort_by-instance_method并提供一组值。它将按从左到右的顺序比较它们。默认排序是升序,因此如果您想要相反的排序(例如 matches_won 应按降序排序,以便大多数匹配项排在第一位,而不是 matches_lost,后者应从低到高排序),则需要否定该值。
这是一个例子
require 'pp'
Team = Struct.new :won, :lost, :demerits, :style
teams = Array.new(20) { Team.new rand(5), rand(5), rand(5), rand(5) }
puts "Before sort:"
pp teams
puts "", "After sort:"
pp teams
teams.sort_by! { |team| [-team.won, team.lost, team.demerits, -team.style] }
# >> Before sort:
# >> [#<struct Team won=1, lost=2, demerits=4, style=3>,
# >> #<struct Team won=0, lost=4, demerits=2, style=2>,
# >> #<struct Team won=4, lost=1, demerits=2, style=3>,
# >> #<struct Team won=1, lost=4, demerits=1, style=4>,
# >> #<struct Team won=3, lost=1, demerits=1, style=4>,
# >> #<struct Team won=3, lost=4, demerits=1, style=2>,
# >> #<struct Team won=4, lost=0, demerits=4, style=0>,
# >> #<struct Team won=3, lost=4, demerits=1, style=2>,
# >> #<struct Team won=1, lost=4, demerits=1, style=2>,
# >> #<struct Team won=3, lost=0, demerits=1, style=1>,
# >> #<struct Team won=3, lost=4, demerits=3, style=4>,
# >> #<struct Team won=1, lost=4, demerits=0, style=0>,
# >> #<struct Team won=3, lost=4, demerits=2, style=0>,
# >> #<struct Team won=3, lost=0, demerits=3, style=0>,
# >> #<struct Team won=1, lost=2, demerits=0, style=1>,
# >> #<struct Team won=3, lost=0, demerits=1, style=0>,
# >> #<struct Team won=0, lost=4, demerits=1, style=4>,
# >> #<struct Team won=1, lost=4, demerits=3, style=0>,
# >> #<struct Team won=3, lost=3, demerits=2, style=3>,
# >> #<struct Team won=0, lost=4, demerits=4, style=4>]
# >>
# >> After sort:
# >> [#<struct Team won=4, lost=0, demerits=4, style=0>,
# >> #<struct Team won=4, lost=1, demerits=2, style=3>,
# >> #<struct Team won=3, lost=0, demerits=1, style=1>,
# >> #<struct Team won=3, lost=0, demerits=1, style=0>,
# >> #<struct Team won=3, lost=0, demerits=3, style=0>,
# >> #<struct Team won=3, lost=1, demerits=1, style=4>,
# >> #<struct Team won=3, lost=3, demerits=2, style=3>,
# >> #<struct Team won=3, lost=4, demerits=1, style=2>,
# >> #<struct Team won=3, lost=4, demerits=1, style=2>,
# >> #<struct Team won=3, lost=4, demerits=2, style=0>,
# >> #<struct Team won=3, lost=4, demerits=3, style=4>,
# >> #<struct Team won=1, lost=2, demerits=0, style=1>,
# >> #<struct Team won=1, lost=2, demerits=4, style=3>,
# >> #<struct Team won=1, lost=4, demerits=0, style=0>,
# >> #<struct Team won=1, lost=4, demerits=1, style=4>,
# >> #<struct Team won=1, lost=4, demerits=1, style=2>,
# >> #<struct Team won=1, lost=4, demerits=3, style=0>,
# >> #<struct Team won=0, lost=4, demerits=1, style=4>,
# >> #<struct Team won=0, lost=4, demerits=2, style=2>,
# >> #<struct Team won=0, lost=4, demerits=4, style=4>]