2012-12-11 41 views
2

这里是我的代码片段:Ruby-如何构建多值散列?

something_1.each do |i| 
    something_2.each do |j| 
     Data.each do |data| 
     date = data.attribute('TIME_PERIOD').text 
     value = data.attribute('OBS_VALUE').text 
     date_value_hash[date] = value 
    end 
    end 
    end 

我想捕获所有的值一个日期。日期是我的散列的关键,它可能有一个日期的多个值。我怎么能在这里完成?当我使用这一行时:

date_value_hash[date] = value 

每次迭代循环时值都被替换。但是,我想累积每个日期的date_value_hash中的所有值,即我想动态构建这些值。

目前我正在此:

{"1990"=>"1", "1994"=>"2", "1998"=>"0"} 

不过,我想是这样的:

{"1990"=>"1,2,3,4,5,6", "1994"=>"1,2,3,4,5,6", "1998"=>"1,2,3,4,5,6"} 

任何人有任何想法,我怎么能做到呢?

+0

为什么下投票吗?这是非常愚蠢的要求吗? –

+1

我没有让你失望,但你的第一个代码片断有更多的信息比必要的。你的编辑改进了一下,更容易看到你所问的具体问题。 –

+0

我明白了,并改变了我的代码,删除了不必要的部分。谢谢。 –

回答

5

像这样

magic = Hash.new{|h,k|h[k]=[]} 
magic["1990"] << "A" 
magic["1990"] << "B" 
magic["1994"] << "C" 
magic["1998"] << "D" 
magic["1994"] << "F" 

之后magic

{"1998"=>["D"], "1994"=>["C", "F"], "1990"=>["A", "B"]} 

,如果你需要的值作为逗号分隔字符串(由您的样本数据所示),你只访问它们作为

magic['1990'].join(',') 

其产生

如果以后你想传递 magic周围,阻止它自动地创建密钥,只是把它包装成如下

hash = Hash.new.update(magic) 

希望帮助

"A,B" 

+0

谢谢,这真的很有帮助。 –

+1

你甚至可以更简单地初始化你的散列:'magic = Hash.new []' – tessi

+0

这不会起作用,它将为所有值使用SAME数组,并且它不会将它们添加到散列。 'h = Hash.new([]); h [:a] << 1; h [:b] << 2'将这两个值添加到同一个数组中,并且保留散列值为空。 – akuhn

2

在Ruby中建立多值散列的另一种方法:

h = {} 
(h[:key] ||= []) << "value 1" 
(h[:key] ||= []) << "value 2" 
puts h