Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > hash of arrays - appending to one of the arrays

Reply
Thread Tools

hash of arrays - appending to one of the arrays

 
 
Adam Akhtar
Guest
Posts: n/a
 
      03-25-2008
Hi Ive done a search on this and there have been quite a few posts which
have incresed my knowlege somewhat but still have a few questions.

Im creating a hash of arrays. The keys and values are added within a
loop. For each key there may be multiple values hence the need for an
array as a value. Values for a key are found over interations of a loop.
I therefore have to append a new found value to the existing values in
an array.

I tried doing this

something.each do |blah|
if (test something)
hash[key] = hash[key] + value
end
end

but the compliler complains about there being no method for nil class.

I read the basic way to do this would be

hash[key] = [] #create blank array
hash[key] = hash[key] + value

but as im in a loop that would require me to do a check to see if the
key exists or not. If im processing lots of informatino that would slow
me down a bit.

IS there a slicker way of doing this?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
David A. Black
Guest
Posts: n/a
 
      03-25-2008
Hi --

On Tue, 25 Mar 2008, Adam Akhtar wrote:

> Hi Ive done a search on this and there have been quite a few posts which
> have incresed my knowlege somewhat but still have a few questions.
>
> Im creating a hash of arrays. The keys and values are added within a
> loop. For each key there may be multiple values hence the need for an
> array as a value. Values for a key are found over interations of a loop.
> I therefore have to append a new found value to the existing values in
> an array.
>
> I tried doing this
>
> something.each do |blah|
> if (test something)
> hash[key] = hash[key] + value
> end
> end
>
> but the compliler complains about there being no method for nil class.
>
> I read the basic way to do this would be
>
> hash[key] = [] #create blank array
> hash[key] = hash[key] + value
>
> but as im in a loop that would require me to do a check to see if the
> key exists or not. If im processing lots of informatino that would slow
> me down a bit.
>
> IS there a slicker way of doing this?


The most common idiom is:

(hash[key] ||= []) << value

You can also make a hash that has a default behavior, for non-existent
keys, of putting an array at that key:

irb(main):004:0> hash = Hash.new {|h,k| h[k] = [] }
=> {}
irb(main):005:0> hash[1] << 2
=> [2]
irb(main):006:0> hash
=> {1=>[2]}


David

--
Upcoming Rails training from David A. Black and Ruby Power and Light:
ADVANCING WITH RAILS April 14-17 New York City
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
CORE RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for more info!

 
Reply With Quote
 
 
 
 
Adam Akhtar
Guest
Posts: n/a
 
      03-25-2008

> The most common idiom is:
>
> (hash[key] ||= []) << value
>


Thanks for the reply. Can I ask what these || mean..in this case do they
mean OR???

does anyone have any good links on using the use of arrays with hashes
in this manner?

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

 
Reply With Quote
 
Jesús Gabriel y Galán
Guest
Posts: n/a
 
      03-25-2008
On Tue, Mar 25, 2008 at 1:41 PM, Adam Akhtar <(E-Mail Removed)> wrote:
>
> > The most common idiom is:
> >
> > (hash[key] ||= []) << value
> >

>
> Thanks for the reply. Can I ask what these || mean..in this case do they
> mean OR???


a ||= b means a = a || b

and it's a common idiom to assign a value only when the lhs is nil (or false).
A hash by default will return nil for non-existing keys so:

hash[key] ||= [] could be written as hash[key] = hash[key] || []

and means: if the key is not present in the hash, create that entry in
the hash with an empty array as the value.

> does anyone have any good links on using the use of arrays with hashes
> in this manner?


I don't have a link, but if you are doing that in a lot of places, remember you
can change the default behaviour of a hash to do the above for you:

hash = Hash.new {|h,k| h[k] = []}

from there on you can say just:

hash[key] << value

because the default value for an inexistent key will trigger the
creation of a new array assigned to that key.

Jesus.

 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      03-25-2008
Hi --

On Tue, 25 Mar 2008, Adam Akhtar wrote:

>
>> The most common idiom is:
>>
>> (hash[key] ||= []) << value
>>

>
> Thanks for the reply. Can I ask what these || mean..in this case do they
> mean OR???


Yes. This:

a ||= b

is the same as:

a or a = b

I used to describe it like this:

a = a || b

but there are some edge cases where that doesn't apply (having to do
with hash defaults, actually, but you don't need to worry about it in
this case). Matz clarified it with the "or" version at RubyConf last
year.

> does anyone have any good links on using the use of arrays with hashes
> in this manner?


I don't know -- I just sort of use them


David

--
Rails training from David A. Black and Ruby Power and Light:
ADVANCING WITH RAILS April 14-17 New York City
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
See http://www.rubypal.com for details and updates!

 
Reply With Quote
 
Adam Akhtar
Guest
Posts: n/a
 
      03-25-2008
Many thanks for that. Thats helped my code a lot. Cheers


--
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
hash of hash of hash of hash in c++ rp C++ 1 11-10-2011 04:45 PM
Hash of Hash of Arrays Question Älphä Blüë Ruby 5 07-18-2009 07:36 PM
Hash#select returns an array but Hash#reject returns a hash... Srijayanth Sridhar Ruby 19 07-02-2008 12:49 PM
Accessing Hash of hash of arrays Lynn Perl Misc 9 02-16-2005 06:59 PM
Sort a hash based on values in the hash stored as arrays of hashes Tore Aursand Perl Misc 3 09-16-2003 10:14 AM



Advertisments