如果要迭代数组的每个第n个值,如何增加n的增量?

时间:2016-01-09 21:54:11

标签: arrays ruby loops

我试图弄清楚如何增加n的值,以便我可以多次迭代一个数组,同时只抓取某些元素。

所以,让我们说,

array = [1,2,3,4,5,6,7,8]
final_array = []
array.map.with_index do |x,i| 
   num = 2
    final_array << x if (i+1) % num == 0
    num += 1
end

这只会运行到i % 2,并且不会针对34或其他任何内容运行。我需要收集i % 2,然后i % 3等所有元素。我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果你不关心时间复杂性,请参阅。 O(n*m) vs O(n),您可以制作嵌套循环。

numbers = [1, 2, 3, 4, 5, 6]
divisors = [1, 2, 3]
numbers_by_divisor = Hash.new { |h, k| h[k] = [] }

divisors.each do |divisor|
  numbers.each do |number|
    numbers_by_divisor[divisor] << number if (number + 1) % divisor == 0
  end
end

numbers_by_divisor哈希将是您想要的数组的哈希值,每个数组的键都是divisor

如果您不关心将这些数字分成不同的数组,而不是numbers_by_divisor哈希只有一个名为divisible_numbers的数组:

numbers = [1, 2, 3, 4, 5, 6]
divisors = [1, 2, 3]
divisible_numbers = []

divisors.each do |divisor|
  numbers.each do |number|
    divisible_numbers << number if (number + 1) % divisor == 0
  end
end

后者可以在更多&#34; Ruby&#34;使用selectany语句的方式:

numbers.select do |number|
  divisors.any? { |divisor| (number + 1) % divisor == 0 }
end

答案 1 :(得分:2)

这应该有效:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(2..5).map { |n| (0...numbers.size).step(n).map { |i| numbers[i] } }
#=> [[1, 3, 5, 7, 9], [1, 4, 7, 10], [1, 5, 9], [1, 6]]

您也可以将第一个map替换为flat_map以获得一个扁平数组,即:

(2..5).flat_map { |n| (0...numbers.size).step(n).map { |i| numbers[i] } }
#=> [1, 3, 5, 7, 9, 1, 4, 7, 10, 1, 5, 9, 1, 6]