How can I create a hash that contains an array for its value? How can I then
loop through the hash keys and intern the contained arrays.
Pseudo Code
···
------------------
myhash['customercode'][0]=Firstname
myhash['customercode'][1]=M.I
myhash['customercode'][2]=Lastname
myhash.each do |k,v|
myhash['k'].each do |elm|
puts "#{k} -> elm"
end
end
myhash['customercode'] = Array.new
myhash['customercode'][0]=Firstname
myhash['customercode'][1]=M.I
myhash['customercode'][2]=Lastname
myhash.each do |el|
el.each do |elm|
puts "#{k} -> elm"
end
end
Should work. Also, if you want to have every item of the hash default
to an array, something like this to construct the Hash is what you
want:
h = Hash.new { |hash, key| hash[key] = Array.new }
Douglas
hsh = Hash.new { |this_hash, key_that_didnt_exist| this_hash[key_that_didnt_exist] = }
···
On May 22, 2006, at 4:28 PM, Paul D. Kraus wrote:
How can I create a hash that contains an array for its value? How can I then
loop through the hash keys and intern the contained arrays.
Pseudo Code
------------------
myhash['customercode'][0]=Firstname
myhash['customercode'][1]=M.I
myhash['customercode'][2]=Lastname
myhash.each do |k,v|
myhash['k'].each do |elm|
puts "#{k} -> elm"
end
end
How can I create a hash that contains an array for its value? How can I then
loop through the hash keys and intern the contained arrays.
Pseudo Code
------------------
myhash['customercode'][0]=Firstname
myhash['customercode'][1]=M.I
myhash['customercode'][2]=Lastname
Another solution picking up Daniel's suggestion:
Item = Struct.new :first_name, :mi, :last_name
=> Item
myhash = Hash.new {|h,k| h[k]=Item.new}
=> {}
myhash['code'].first_name = "first"
=> "first"
myhash['code'].mi = "mi"
=> "mi"
myhash['code'].last_name = "last"
=> "last"
myhash['code']
=> #<struct Item first_name="first", mi="mi", last_name="last">
myhash.each do |k,v|
myhash['k'].each do |elm|
puts "#{k} -> elm"
end
end
You're making things more complicated than necessary. This will work
(with you array approach and with my suggestion):
myhash.each do |k, v|
?> v.each {|elm| puts "#{k} -> #{elm}" }
end
code -> first
code -> mi
code -> last
=> {"code"=>#<struct Item first_name="first", mi="mi", last_name="last">}
alternative
myhash.each {|k,it| it.each {|val| print k, " -> ", val, "\n"} }
code -> first
code -> mi
code -> last
=> {"code"=>#<struct Item first_name="first", mi="mi", last_name="last">}
Btw, also you use 'k' as a key in your iteration - you must remove the
single quotes to make it work the way you want.
Kind regards
robert
···
2006/5/22, Paul D. Kraus <paul.kraus@gmail.com>:
--
Have a look: Robert K. | Flickr
h = Hash.new { |hash, key| hash[key] = Array.new }
Newbie here but what exactly does this like do.
Can you someone break it down for me thanks.
This creates a new hash with a "default block" which will be called
whenever someone tries to get a value for a non-existent key. When the
block is called a new Array is created for the given key value and
stored in the hash. Therefore you can do things like the following and
they will just magically work:
h[:people] << "Paul"
h[:people] << "Douglas"
h[:people] << "Simon"
h[:animals] << "Dog"
h[:animals] << "Cat"
h[:animals] << "Armadillo"
Ryan
···
On 5/22/06, Paul D. Kraus <paul.kraus@gmail.com> wrote:
>
> h = Hash.new { |hash, key| hash[key] = Array.new }
Newbie here but what exactly does this like do.
Can you someone break it down for me thanks.
From the docs: class Hash - RDoc Documentation
If you try and get the value using a hash key which does not exist,
then the value of the block when called with the hash and the new key
will be returned instead.
Douglas
···
2006/5/22, Paul D. Kraus <paul.kraus@gmail.com>:
>
> h = Hash.new { |hash, key| hash[key] = Array.new }
Newbie here but what exactly does this like do.
Can you someone break it down for me thanks.