我试图按给定的数量递增散列的所有值并返回散列。我期待着:
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}
为什么哈希按字母顺序排序?
答案 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}
哈希将按您的意愿排序。