Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > ruby puzzle: Group candies by unique record fields

Reply
Thread Tools

ruby puzzle: Group candies by unique record fields

 
 
Woga Swoga
Guest
Posts: n/a
 
      12-19-2006
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!

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Brad Phelan
Guest
Posts: n/a
 
      12-19-2006
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

----------------
##########'
---
good:
- :taste: good
:name: a
:color: blue
- :taste: good
:name: e
:color: green
yuck:
- :taste: yuck
:name: b
:color: blue
- :taste: yuck
:name: d
:color: blue
- :taste: yuck
:name: f
:color: green
ok:
- :taste: ok
:name: c
:color: red
##########'
##########'
---
green:
- :taste: good
:name: e
:color: green
- :taste: yuck
:name: f
:color: green
blue:
- :taste: good
:name: a
:color: blue
- :taste: yuck
:name: b
:color: blue
- :taste: yuck
:name: d
:color: blue
red:
- :taste: ok
:name: c
:color: red
##########'


--
Brad Phelan
http://xtargets.com
 
Reply With Quote
 
 
 
 
juan pedro meriņo
Guest
Posts: n/a
 
      12-19-2006
ruby soppourt a cron?

can ruby have a cron for his can control?

how i use ruby for create a system a control of user?

2006/12/19, Brad Phelan <(E-Mail Removed)>:
> 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
>
> ----------------
> ##########'
> ---
> good:
> - :taste: good
> :name: a
> :color: blue
> - :taste: good
> :name: e
> :color: green
> yuck:
> - :taste: yuck
> :name: b
> :color: blue
> - :taste: yuck
> :name: d
> :color: blue
> - :taste: yuck
> :name: f
> :color: green
> ok:
> - :taste: ok
> :name: c
> :color: red
> ##########'
> ##########'
> ---
> green:
> - :taste: good
> :name: e
> :color: green
> - :taste: yuck
> :name: f
> :color: green
> blue:
> - :taste: good
> :name: a
> :color: blue
> - :taste: yuck
> :name: b
> :color: blue
> - :taste: yuck
> :name: d
> :color: blue
> red:
> - :taste: ok
> :name: c
> :color: red
> ##########'
>
>
> --
> Brad Phelan
> http://xtargets.com
>
>


 
Reply With Quote
 
James Edward Gray II
Guest
Posts: n/a
 
      12-19-2006
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"=>#<Set: {{:color=>"green", :taste=>"yuck", :name=>"f"},
{:color=>"green", :taste=>"good", :name=>"e"}}>, "blue"=>#<Set:
{{:color=>"blue", :taste=>"good", :name=>"a"},
{:color=>"blue", :taste=>"yuck", :name=>"d"},
{:color=>"blue", :taste=>"yuck", :name=>"b"}}>, "red"=>#<Set:
{{:color=>"red", :taste=>"ok", :name=>"c"}}>}

James Edward Gray II

 
Reply With Quote
 
William James
Guest
Posts: n/a
 
      12-19-2006
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
>
> ----------------
> ##########'
> ---
> good:
> - :taste: good
> :name: a
> :color: blue
> - :taste: good
> :name: e
> :color: green
> yuck:
> - :taste: yuck
> :name: b
> :color: blue
> - :taste: yuck
> :name: d
> :color: blue
> - :taste: yuck
> :name: f
> :color: green
> ok:
> - :taste: ok
> :name: c
> :color: red
> ##########'
> ##########'
> ---
> green:
> - :taste: good
> :name: e
> :color: green
> - :taste: yuck
> :name: f
> :color: green
> blue:
> - :taste: good
> :name: a
> :color: blue
> - :taste: yuck
> :name: b
> :color: blue
> - :taste: yuck
> :name: d
> :color: blue
> red:
> - :taste: ok
> :name: c
> :color: red
> ##########'



$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 property
values = $candies.inject([]){|ary,hash| ary << hash[property] }.uniq
values.sort.each{|val| puts val
$candies.select{|h| h[property] == val}.each{|h|
puts " " + h.to_a.reject{|k,v| k == property }.
map{|k,v| "#{k}: #{v}"}.join( "; " ) }
}
end

print_candies_by :color

--- output -----
blue
name: a; taste: good
name: b; taste: yuck
name: d; taste: yuck
green
name: e; taste: good
name: f; taste: yuck
red
name: c; taste: ok

 
Reply With Quote
 
Drew Olson
Guest
Posts: n/a
 
      12-20-2006
Woga Swoga wrote:

> 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!


Not sure if your Candy list is actually a hash or just an array of Candy
objects. I'll write the code assuming the later.

group_flag = false
group_flag = true if group == "color"
grouping = {}

candy.each do |piece|
element = piece.color if group_flag
element = piece.taste if !group_flag
grouping[element] ||= []
grouping[element] << piece
end

grouping.each do |key,element|
puts "Grouping: #{key}"
element.each do |piece|
puts " "+candy.name
end
end

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Is there a unique method in python to unique a list? Token Type Python 9 09-09-2012 02:13 PM
list question... unique values in all possible unique spots ToshiBoy Python 6 08-12-2008 05:01 AM
Two candies bearophileHUGS@lycos.com Python 6 01-03-2008 04:29 AM
pez candies George Computer Support 2 02-09-2007 07:50 PM
Getting Unique ID from new record Glyn Williams ASP .Net 1 03-02-2004 08:41 PM



Advertisments