On 2003-08-09 16:47:10 +0900, Meino Christian Cramer wrote: > But sort_by needs an array as input. No, sort_by is a method of Enumerable and Enumerable is a mixin that can be included in every class that implements the each method. > Two questions: > What I have to feed where into the structure to sort the broadcasters > by frequency first and then by on-air-time ? There are many possibilties. You could use sort_by as you said (escpecially if you want to use a different order at different occasions) or you could mixin Comparable into your Broadcaster class and let the Broadcaster objects decide on their own how to compare to each other. > Is this "design" ok (in the sense of OOP)? If you want to define one order that should be used for every broadcaster, the Comparable version is more OOP because the Broadcaster objects have the responsibility to compare to each other. If you want more than one order it's perhaps better if the container class has that responsibility. class Broadcaster include Comparable def initialize(freq, station, time) @freq, @station, @time = freq, station, time end attr_reader :freq, :station, :time def <=>(other) (self.freq <=> other.freq).nonzero? || other.time <=> self.time end def to_s "<#@station: #@freq #@time>" end end class List include Enumerable def initialize @list = Array.new end def append(broadcaster) @list.push(broadcaster) end def each(&block) @list.each(&block) end end alphabet = ("A".."Z").to_a list = List.new 10.times do list.append Broadcaster.new( 90.66 + rand(10), (1..4).map { alphabet[rand(alphabet.size)] }.join, rand(10000) ) end puts "sort_by:" puts list.sort_by { |x| [ x.freq, -x.time ] } puts "sort:" puts list.sort -- Programs must be written for people to read, and only incidentally for machines to execute. -- Abelson/Sussman, The Structure and Interpretation of Computer Programs