我想通过键创建一个组哈希并添加值

Posted

技术标签:

【中文标题】我想通过键创建一个组哈希并添加值【英文标题】:i want to make a group Hash by keys and add values 【发布时间】:2021-10-13 20:34:32 【问题描述】:

我有一个像这样的哈希

arr =  93=>1, 92=>1, 91=>0,90=>0,29=>1340,28=>1245,27=>1231,26=>1102,25=>937,24=>688, 23=>540, 22=>360, 21=>270, 20=>143, 19=>77,18=>62,17=>39, 16=>42, 15=>27, 14=>12, 13=>4, 12=>2, 11=>2

我想要结果

arr = 9 => sum values of Nineties, 2 => sum values of twenties, 1 =>  sum values of age teens

【问题讨论】:

你的哈希为什么叫arr ArrayHash 是两种截然不同的对象。不要混淆它们! 【参考方案1】:

我会使用each_with_object 方法。 (key, value) 这里是每个键/值对的解构,如93=>1hash 是存储结果的中间对象。

data.each_with_object() do |(key, value), hash|
  result_key = 
      case key
      when 10..19 then 1
      when 20..29 then 2
      when 90..99 then 9
      end
  next if result_key.nil?    
  hash[result_key] ||= 0
  hash[result_key] += value    
end

对于提供的输入,我得到了9=>2, 2=>7856, 1=>267

UPD

Holger Just 和 Stefan 在下面的 cmets 中提出了一个较短的解决方案。

data.each_with_object(Hash.new(0)) do |(key, value), hash|
  hash[key / 10] += value
end

使用Hash.new(0),初始对象将是具有默认值0的哈希

> hash = Hash.new(0)
=> 
> hash[1]
=> 0

【讨论】:

你可以使用result_key = key / 10 其实如果把初始对象从改成Hash.new(0)整个块就可以缩减成hash[key / 10] += value 对于给定的输入是

以上是关于我想通过键创建一个组哈希并添加值的主要内容,如果未能解决你的问题,请参考以下文章

ruby 哈希,其中键来自数组,值作为默认值

Java:哈希图中的复合键

如果密钥存在,添加一些哈希值?

修改 CLOB 以删除重复项

雷林鹏分享:Ruby 哈希(Hash)

按键对哈希进行分组并对值求和