我有两个数组,并希望循环使用这两个数组并根据条件将它们分组。我这样做了,它没有给我我需要的东西。
len = [24,71,312,99,89]
diff = [11,7,7,21,3]
a = []
len.zip(diff).each do |l,d|
if d < 10
a << l
else
a << [l]
end
end
我希望结果如下:
a = [[24], [71,312], [99,89]]
我想在数组中添加每个组,以便:
a = [24, 383, 188]
非常感谢一些帮助。 感谢
答案 0 :(得分:1)
您正在寻找的方法是chunk
:
len.zip(diff).chunk { |l, d| d < 10 }.map { |_, d| d.map(&:first).inject(:+) }
# => [24, 383, 99, 89]
(我假设分组是通过使diff小于或大于10,这意味着正确的分组是[[24], [71,312], [99], [89]]
,而不是在OP中写的
答案 1 :(得分:0)
有很多方法可以做到这一点。如果您想保留已采用的基本方法,可以按如下方式修改代码:
<强>代码强>
def doit(len, diff)
a = []
b = []
len.zip(diff).each do |l,d|
if d < 10
b << l
else
(a << b; b = []) if b.any?
a << [l]
end
end
a << b if b.any?
a.map { |e| e.reduce(:+) }
end
示例强>
len = [24, 71, 312, 99, 89]
diff = [11, 7, 7, 21, 13]
doit(len, diff) #=> [24, 383, 99, 89]
和其他人一样,我认为你想要的结果应该是我所展示的。
<强>解释强>
a = []
b = []
last = nil
arr = len.zip(diff)
#=> [[24, 11], [71, 7], [312, 7], [99, 21], [89, 3]]
enum = arr.each
#=> #<Enumerator: [[24, 11], [71, 7], [312, 7], [99, 21], [89, 3]]:each>
我们可以将枚举器enum
转换为数组,以便查看它将传递到其块中的值:
enum.to_a
#=> [[24, 11], [71, 7], [312, 7], [99, 21], [89, 3]]
传递给块的第一个值enum
将以下值分配给其块变量:
l => 24
d => 11
由于d < 10
为false
,b.any? #=> false
表示我们不执行a << b; b = []
,但我们会执行:
a << l #=> [24]
enum
现在将第二个元素传递给块并将块变量设置为:
l => 71
d => 7
由于d < 10
现在是true
,我们执行:
b << l #=> [71]
和a
保持不变。接着,
l => 312
d => 7
所以
b << l #=> [71, 312]
下一步:
l => 99
d => 21
自b.any? => true
:
a << b #=> [[24], [71, 312]]
b = [] #=> []
a << [l] #=> [[24], [71, 312], [312]]
enum
将所有元素传递给块后,
a #=> [[24], [71, 312], [99]]
b #=> [89]
所以
a << b if b.any?
#=> [[24], [71, 312], [99], [89]]
已执行。如果diff
的最后一个值是13,而不是3 b #=> []
,那么a << b
就不会被执行。
最后,
a.map { |e| e.reduce(:+) }
#=> [24, 383, 99, 89]