gpt4 book ai didi

arrays - `Array#each_slice` ,开头留余数

转载 作者:数据小太阳 更新时间:2023-10-29 08:14:35 24 4
gpt4 key购买 nike

我正在尝试将一个数组分成三个一组。我想把余数放在开头(下例中的 [1, 2])。

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
...
#=> [[1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

有什么好的方法可以做到这一点吗?

拆分数组的常用方法是:

arr.each_slice(3)
# => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]

最后给出余数 [10, 11]。我尝试如下,认为 each_slice 可能会接受一个否定的参数并将其读取为通过数组倒退。

arr.each_slice(-3)

唉,没用。

最佳答案

虽然可以将数组反转三次,但有更有效的方法来实现目标:

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
a = arr.dup # not to modify it inplace
[a.shift(a.size % 3)] + a.each_slice(3).to_a
#⇒ [[1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

顺便说一句,arr.each_slice(3) 返回一个枚举数,而不是您在问题中发布的数组。

upd 或按照 Cary Swoveland 的建议,使 dup 无效:

n = a.size % 3
[a[0...n]] + a[n..-1].each_slice(3).to_a

upd 摆脱 dup by @sawa:

[a.first(a.size % 3)] + a.drop(a.size % 3).each_slice(3).to_a

upd 只是出于好奇(假设输入没有 nil 元素):

([nil] * (3 - a.size % 3) + a).each_slice(3).to_a.tap do |a|
a.unshift(a.shift.compact!)
end

上面的代码可能会在原始数组上安全运行,它不会就地修改它。

UPD2 正如 Stefan 在评论中指出的那样,如果数组可被 3 整除,则上述任何一个都会产生一个初始的空切片。因此,正确的解决方案(顺便说一句,最快的)应该看起来像:

(arr.size % 3).zero? ? arr.each_slice(3).to_a : ANY_OF_THE_ABOVE

关于arrays - `Array#each_slice` ,开头留余数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34606492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com