ruby循环遍历两个数组并根据条件对它们进行分组

时间:2014-05-09 16:46:46

标签: ruby arrays

我有两个数组,并希望循环使用这两个数组并根据条件将它们分组。我这样做了,它没有给我我需要的东西。

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]

非常感谢一些帮助。 感谢

2 个答案:

答案 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 < 10falseb.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]