我有一个散列,其中每个键对应于它的频率:
hsh = {'a' => 2, 'b' => 3, 'c' => 1}
我想分解成一个数组:
arr = ['a', 'a', 'b', 'b', 'b', 'c']
我使用了以下方法,但是有更好的方法吗?
arr = []
hsh.each do |x,y|
y.times do
arr << x
end
end
答案 0 :(得分:8)
arr = hsh.flat_map { |k, v| [k] * v }
#=> ["a", "a", "b", "b", "b", "c"]
答案 1 :(得分:2)
你可以做一个像:
的班轮hsh.map { |k,v| Array.new(v,k) }.flatten
map迭代为each
并返回一个包含每次迭代结果的数组。对于每个条目,您创建一个包含v
元素的新数组,其默认值为k
。由于map
将是一个数组数组,您需要将其展平。
或
hsh.each_with_object([]) do|(k, v),arr|
v.times { arr << k }
end
each_with_object
会迭代并为您提供一个最初传递的对象。通常,您使用此对象来累积数据。它与您的类似,但您不必在另一行中初始化数组
但老实说,它们看起来不太可读。
答案 2 :(得分:0)
您的方法似乎很好,但您也可以像这样编写
hash.flat_map { |k,v| v.times.map { k } }