我有一个散列的散列数组,其中每个键对应于它的频率:如何创建从具有元件和频率
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
我有一个散列的散列数组,其中每个键对应于它的频率:如何创建从具有元件和频率
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
你可以做一个衬垫,如:
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
迭代,并给你一个对象,以及,其中传递最初。通常你使用这个对象来累积数据。它与你的相似,但你不必在另一行初始化阵列
但说实话,他们看起来不太可读。
arr = hsh.flat_map { |k, v| [k] * v }
#=> ["a", "a", "b", "b", "b", "c"]
这就是它的全部。不知道有一个更好/更简单的方法:) –
或'hsh.flat_map {| * k,v | k * v}' – Stefan
你的方法似乎不错,但你也可以把它写这样
hash.flat_map { |k,v| v.times.map { k } }
如果代码有效,并且想要更好的方法,则应考虑使用[codereview.se]而不是[so]。 –