假设我有一个大小在700.000到800.000之间的数组,我需要迭代它来完成一些奇特的任务。
对于"相同的偶数和奇数位置"我的意思是:
[0,0,1,1,2,2,3,3] // even and odd are the same
[0,1,1,1,2,2,3,3] // even and odd are not the same (arr[0] and arr[1] are differents)
[0,0,1,1,2,2,3] // even and odd are not the same (last value missing)
如果偶数和奇数位置的值相同,我需要将此函数应用于每个值:
transition_left_right << i*@maxS
如果偶数和奇数不同,我必须将此函数应用于每个偶数值:
transition_left << i*@maxE
和每个奇数值:
transition_right << i*@maxO
最快的方法是什么? (没有多次迭代巨大的数组)。最好的是1次迭代......
答案 0 :(得分:2)
试试这个。
# odd/even always the same?
[1,1,2,2,3].each_slice(2).all? { |a,b| a == b }
#=> false
# hope I got your explaination right
@maxO, @maxE = 2, 3
[1,1,2,2,3].each_slice(2).flat_map do |odd,even|
odd == even ? [odd,even] : [odd*@maxO, even && even*@maxE]
end.compact
#=> [1, 1, 2, 2, 6]
答案 1 :(得分:1)
正如@ sschmeck的回答所示,Enumerable#each_slice
是要走的路。我假设transition_left_right
,transition_left
,transition_right
,@maxS
,@maxO
和@maxE
是已存在的变量,{ {1}}是数组中的偶数或奇数值。
如果是这样,那么我想你想要这个:
i