Ruby - 通过乘法创建出现次数的数组集合

4
我想创建一个大小为100的数组,其中的值将出现在另一个数组中定义的X次。
因此,下面这些数组:
arr1 = ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']
arr2 = [5, 5, 10, 10, 20, 50] 

将创建一个新数组,其中包含5个值为'text1',50个值为'text6'等。

你想要包含字符串的子数组还是一个扁平的数组? - dawg
3个回答

7

试试这个

arr1.zip(arr2).flat_map { |s, n| Array.new(n) { s } }

我首先将每个字符串与其整数配对,然后遍历这些配对并创建一个包含n个s字符串的数组。使用flat_map而不是简单的map可以避免产生多维数组。


只是想指出当两个数组大小相同时,ziptranspose的等效性,这可以写成[arr1,arr2] .transpose.flat_map.... - Cary Swoveland
感谢 @CarySwoveland ^_^ - Ursus
根据 OP 的需求,Array.new(n){s} 可能更可取。 - Eric Duminil

6

您可以做:

arr1.zip(arr2).map {|s,x| [s]*x}

这将生成一个包含子数组[[s,s,s..],[s2,s2,s2...]]的数组。如果您不希望每个字符串都在单独的子数组中:

arr1.zip(arr2).flat_map {|s,x| [s]*x}

正如评论中指出的,ziptranspose 是等价的,因此您可以这样做:
[arr1, arr2].transpose.flat_map { |s,x| [s] * x }

或者使用 flat_map 代替 mapflatten - mu is too short
2
进一步回应@muistooshort的观点,如果您认为flat_mapflatten更好(我猜您是这么认为的),为什么不直接删除flatten行呢?“谁建议了什么”并不重要;只需尽可能给出最佳答案,并纳入他人提出的有价值的建议即可。 - Cary Swoveland

2

Array#cycle

arr1.flat_map.with_index { |s,i| [s].cycle.take arr2[i] }

Array#fill

arr2.flat_map.with_index { |n,i| [].fill arr1[i], 0...n }

Array#*

arr1.flat_map.with_index { |s,i| [s] * arr2[i] }

Array#insert

arr1.map.with_index { |s,i| [].insert 0, [s] * arr2[i] }.flatten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接