2

这是我的代码片段:

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 是我的哈希的键,它可能有多个值用于单个日期。我怎样才能在这里做到这一点?当我使用这条线时:

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"} 

任何人都知道我该如何做到这一点?

4

2 回答 2

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(',')

产生

"A,B"

如果稍后您想传递magic并阻止它自动创建密钥,只需将其包装如下

hash = Hash.new.update(magic)

希望有帮助!

于 2012-12-11T00:17:14.390 回答
2

在 Ruby 中构建多值哈希的另一种方法:

h = {}
(h[:key] ||= []) << "value 1"
(h[:key] ||= []) << "value 2"
puts h 
于 2014-10-10T02:49:54.117 回答