在Ruby中复制数组元素

5

我有一个数组 rangers = ["red", "blue", "yellow", "pink", "black"] (争议中的绿色应该是它的一部分,但我决定省略它)

我想要将数组元素加倍,以便按顺序返回 rangers = ["red", "red", "blue", "blue", "yellow", "yellow", "pink", "pink", "black", "black"]

我试图在SO上寻找,但我找不到以那种顺序执行此操作的方法。(rangers *= 2 不起作用)。

我还尝试过 rangers.map{|ar| ar * 2} #=> ["redred", "blueblue",...]

我试过 rangers << rangers #=> ["red", "blue", "yellow", "pink", "black", [...]]

如何复制元素以返回相邻的重复元素值?如果可能的话,我想将其复制 n 次,因此当 n = 3 时,它会返回 ["red", "red", "red", "blue", "blue", "blue", ...]


1
绿色的游侠是最好的,哈哈。;P - Julian Kniephoff
1个回答

9
如何呢?
rangers.zip(rangers).flatten

使用 Array#zipArray#flatten

对于您的第二个请求,可能更好的解决方案是:

rangers.flat_map { |ranger| [ranger] * 2 }

使用Enumerable#flat_map函数。 在这里,您可以将2替换为任何值或变量。


4
也就是:([rangers]*n).inject(&:zip).flatten :)意思是将rangers数组复制n次,并进行二元操作zip,最后展开得到一个新的一维数组。其中 &:zip 是简写方式,表示传递给 inject 方法的块参数是 zip 方法的引用。需要注意的是,这个代码片段并没有指定 nrangers 的值,因此无法确定具体的输出结果。 - Mladen Jablanović
哦,非常好 @MladenJablanović。 ;) - Julian Kniephoff
非常方便!我没有想到使用zip + flatten组合。将来会非常有用。谢谢大家! - Iggy
@MladenJablanović,我认为更好的写法是:([rangers] * n).transpose.flatten。这个问题真的很启发人。x) - Julian Kniephoff
这张卡片允许你直接进入 flat_map 而无需经过 map(即无需提及 map)。 - Cary Swoveland
@CarySwoveland 我就知道你会这么说。;) - Julian Kniephoff

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