From: "Ara.T.Howard" Date: 2005-10-12T14:01:03+09:00 Subject: Re: small array/hash question On Wed, 12 Oct 2005, Kev Jackson wrote: > I got the output I wanted with this > > work_types = Hash.new > if work_types.has_key?(nsc_id) then > work_types[nsc_id]= work_types[nsc_id].include?(work_type) ? > work_types[nsc_id] : work_types[nsc_id] << work_type > else > work_types[nsc_id]= [work_type] > end > > So the problem is solved, but I wonder if there's a more elegant way of > doing it (especially the check to see if the value is already in the array). > My first assumption was that assignment to a Hash took a block (hence the > pseudo code), I was actually a little suprised that it didn't ;) this is one easy way work_types = Hash::new{|h,k| h[k] = []} work_types[ nsc_id ].push( work_type ).uniq! but does a bit of extra work. another way would be to use set require 'set' work_types = Hash::new{|h,k| h[k] = Set::new} work_types[ nsc_id ] << work_type but you must understand set and it's notion of equality. plus you lose data order but, since you are ignoring dups, i guess this isn't important. or perhaps you can model your data with a nested hash? work_types = Hash::new{|h,k| h[k] = {}} work_types[ nsc_id ][ work_type ] = true and then use values = work_types[ nsc_id ].keys or just make your own apprach more compact work_types = Hash::new work_types[ nsc_id ] = [ work_types[ nsc_id ], work_type ].compact.uniq you have options - and there is always sqlite if you start to feel like you are rolling query logic on top of this data structure ;-) regards. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna ===============================================================================