我试图弄清楚如何增加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
,并且不会针对3
或4
或其他任何内容运行。我需要收集i % 2
,然后i % 3
等所有元素。我该怎么做?
答案 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;使用select
和any
语句的方式:
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]