如何从具有元素和频率的哈希创建数组

时间:2016-12-13 20:25:05

标签: ruby

我有一个散列,其中每个键对应于它的频率:

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

3 个答案:

答案 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 } }