From: James Edward Gray II Date: 2006-12-20T03:43:40+09:00 Subject: Re: ruby puzzle: Group candies by unique record fields On Dec 19, 2006, at 10:30 AM, Brad Phelan wrote: > Woga Swoga wrote: >> I have an list of objects (Candy) and each object has two fields >> (Candy.color, Candy.taste). I would like to display the candies but >> group them based on the fields (display a header for each group). >> The >> problem is I don't know how many colors or tastes are in any >> particular >> list of candies. >> This is what I have for input: >> * Candy <-- hash list already pre-sorted by "group" >> * group <-- variable contains either "color" or "taste" >> Can anyone come up with a ruby code snipet that will use the "group" >> variable to extract out the group labels (unique values of the >> color or >> tate field), and then dump out the Candy list by group. >> Really appreciate your help! > > require 'yaml' > > @candies = [ > { :name => 'a', :color => "blue", :taste => "good" }, > { :name => 'b',:color => "blue", :taste => "yuck" }, > { :name => 'c',:color => "red", :taste => "ok" }, > { :name => 'd',:color => "blue", :taste => "yuck" }, > { :name => 'e',:color => "green", :taste => "good" }, > { :name => 'f',:color => "green", :taste => "yuck" } > ] > > def print_candies_by(group) > groups={} > @candies.each do |candy| > key = candy[group] > groups[key] = [] unless groups[key] > groups[key] << candy > end > > puts "##########'" > puts YAML.dump groups > puts "##########'" > end > > > print_candies_by :taste > print_candies_by :color You can also use sets for this: >> require "set" => true >> candies = [ ?> { :name => 'a', :color => "blue", :taste => "good" }, ?> { :name => 'b',:color => "blue", :taste => "yuck" }, ?> { :name => 'c',:color => "red", :taste => "ok" }, ?> { :name => 'd',:color => "blue", :taste => "yuck" }, ?> { :name => 'e',:color => "green", :taste => "good" }, ?> { :name => 'f',:color => "green", :taste => "yuck" } >> ] => [{:color=>"blue", :taste=>"good", :name=>"a"}, {:color=>"blue", :taste=>"yuck", :name=>"b"}, {:color=>"red", :taste=>"ok", :name=>"c"}, {:color=>"blue", :taste=>"yuck", :name=>"d"}, {:color=>"green", :taste=>"good", :name=>"e"}, {:color=>"green", :taste=>"yuck", :name=>"f"}] >> candies.to_set.classify { |c| c[:color] } => {"green"=>#"green", :taste=>"yuck", :name=>"f"}, {:color=>"green", :taste=>"good", :name=>"e"}}>, "blue"=>#"blue", :taste=>"good", :name=>"a"}, {:color=>"blue", :taste=>"yuck", :name=>"d"}, {:color=>"blue", :taste=>"yuck", :name=>"b"}}>, "red"=>#"red", :taste=>"ok", :name=>"c"}}>} James Edward Gray II