通过x修改现有哈希值并返回哈希值

时间:2014-08-06 07:25:50

标签: ruby

我试图按给定的数量递增散列的所有值并返回散列。我期待着:

add_to_value({"a" => 1, "c" => 2,"b"=> 3}, 1) 
# => {"a" => 2, "c" => 3,"b"=> 4}

我在想:

def add_to_value(hash, x)
  hash.each {|key,value| value + x}
end

返回:

{"a"=>1, "b"=>3, "c"=>2}

为什么哈希按字母顺序排序?

3 个答案:

答案 0 :(得分:2)

你非常接近,不需要任何额外的宝石:

def add_to_value(hash, x)
  hash.each {|key,value| hash[key] += x }
end

只需迭代哈希并逐个更新每个值。 #each返回正在迭代的对象,因此结果将是原始哈希值,该哈希值已经过适当的修改。

如果你想要原始哈希的副本,你也可以很容易地做到这一点:

def add_to_value(hash, x)
  hash.each.with_object({}) {|(key, value), out| out[key] = value + x }
end

这将定义一个新的空哈希,将其传递给块,在那里它收集新的值。新哈希值从#with_object返回,因此从add_to_value返回。

答案 1 :(得分:0)

如果您使用某些宝石,例如y_support,问题就会变得微不足道。输入命令行gem install y_support,并享受扩展的哈希迭代器:

require 'y_support/core_ext/hash'

h = { "a"=>1, "c"=>3, "b"=>2 }
h.with_values do |v| v + 1 end
#=> {"a"=>2, "c"=>4, "b"=>3}

至于你的排序问题,我无法重现它。

当然,如果不安装宝石,可能会有一个不太优雅的解决方案:

h.each_with_object Hash.new do |(k, v), h| h[k] = v + 1 end

gem还为您提供Hash#with_keys(修改键)和Hash#modify(修改键和值,从哈希到哈希的映射类型)和带有版本的Hash#with_values!#with_keys!修改哈希值。

答案 2 :(得分:0)

您可以执行以下操作来增加值:

 hash = {}
 {"a" => 1, "c" => 2,"b"=> 3}.each {|k,v| hash[k]=v+1}
 hash
 =>{"a"=>2, "c"=>3, "b"=>4}

哈希将按您的意愿排序。