2016-12-13 46 views
1

我有一个散列的散列数组,其中每个键对应于它的频率:如何创建从具有元件和频率

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

如果代码有效,并且想要更好的方法,则应考虑使用[codereview.se]而不是[so]。 –

回答

2

你可以做一个衬垫,如:

hsh.map { |k,v| Array.new(v,k) }.flatten 

地图迭代如图each并返回一个数组,其结果为每次迭代。对于每个条目,您将创建一个带有v元素的新数组,其默认值为k。由于map的结果将是一个数组数组,所以您需要将其平坦化。

hsh.each_with_object([]) do|(k, v),arr| 
    v.times { arr << k } 
end 

each_with_object迭代,并给你一个对象,以及,其中传递最初。通常你使用这个对象来累积数据。它与你的相似,但你不必在另一行初始化阵列

但说实话,他们看起来不太可读。

8
arr = hsh.flat_map { |k, v| [k] * v } 
#=> ["a", "a", "b", "b", "b", "c"] 
+0

这就是它的全部。不知道有一个更好/更简单的方法:) –

+2

或'hsh.flat_map {| * k,v | k * v}' – Stefan

0

你的方法似乎不错,但你也可以把它写这样

hash.flat_map { |k,v| v.times.map { k } }