Ruby-将数组Map到哈希图

djmepvbi  于 2022-09-21  发布在  Ruby
关注(0)|答案(8)|浏览(181)

我有一个数组和一个函数,它返回给定值的值。最终,我希望创建一个hashmap,它将数组的值作为键值,并将f(Key_Value)的结果作为值。有没有一种干净、简单的方法来使用块来完成这项工作,就像每一个/map of Array一样?

因此,相当于

hsh = {}
[1,2,3,4].each do |x|
  hsh[x] = f(x)
end

但看起来更像这个,因为它很简单,只有一行字?

results = array.map { | x | f(x) }
mepcadol

mepcadol1#

请注意,从Ruby 2.1.0开始,您还可以使用数组#to_h,如下所示:

[1,2,3,4].map{ |x| [x, f(x)] }.to_h
cbeh67ev

cbeh67ev2#

Ruby 2.6.0支持将块传递给to_h-方法。这为从数组创建散列提供了更短的语法:

[1, 2, 3, 4].to_h { |x| [x, f(x)] }
vlf7wbxs

vlf7wbxs3#

您还可以将函数定义为散列的缺省值:

hash = Hash.new {|hash, key| hash[key] = f(key) }

然后,当您查找一个值时,散列将动态计算并存储它。

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
eblbsuwk

eblbsuwk4#

您需要each_with_object

def f x
  x * 2
end

t = [1, 2, 3, 4].each_with_object({}) do |x, memo|
  memo[x] = f(x)
end

t # => {1=>2, 2=>4, 3=>6, 4=>8}

另一个:

t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
exdqitrt

exdqitrt5#

查看Hash::[]方法。

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
nhn9ugyo

nhn9ugyo6#

使用方面的mash(将可枚举值转换为散列的方法):

[1, 2, 3, 4].mash { |x| [x, f(x)] }

来自Ruby 2.1:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
kpbpu008

kpbpu0087#

您正在寻找reduce()|inject()方法:

elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h

传递给reduce({})的参数是作为res变量传递给块的中间对象的初始值。在每次迭代中,我们将新的key: value对添加到res Hash中,并重新获取要在下一次迭代中使用的Hash。

上面的方法预计算出一个非常实用的平方值散列:

{1=>1, 2=>4, 3=>9, 4=>16}
shstlldc

shstlldc8#

另外,index_with会很有帮助:

a = ['a', 'bsdf', 'wqqwc']
a.index_with(&:size)
=> {"a"=>1, "bsdf"=>4, "wqqwc"=>5}

相关问题