我有一个16位的数组:
num = [1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8]
我必须取出从第二个到最后一个数字开头的所有数字,将每个其他元素计算回第一个元素:
every_other_num = num.select.each_with_index{|key, value|value.even?}
=> [1,3,5,7,1,3,5,7]
现在,我需要将这些数字加倍:
every_other_num_doubled = every_other_num.map {|num|num*2}
=> [2,6,10,14,2,6,10,14]
然后,我需要将它们放回到原始数组中,而不是我取出的数组,所以数组看起来像这样:
new_array = [2,2,6,4,10,6,14,8,2,2,6,4,10,6,14,8]
这是我无法得到的最后一部分。当我把它们放回去时,我得到一个巨大的阵列,因为我显然没有将它们从旧阵列中移除。我认为问题在于代码行every_other_num = num.select.each_with_index {| key,value | value.even?},因为它实际上并没有修改原始数组。
答案 0 :(得分:3)
为什么删除它们?这没有任何意义,我没有理由认为这是一项要求。只需将它们加倍就位。
num.each_index { |i| nums[i] *= 2 if i.even? }
如果确实想要删除/替换/重新插入,请使用zip
/ flatten
将两个数组交织在一起:
['a','b','c'].zip([1, 2, 3]).flatten
=> ["a", 1, "b", 2, "c", 3]
答案 1 :(得分:0)
您获取了num
数组,并制作了偶数索引值every_other_num
的副本。
你是对的,原始数组尚未修改。
为什么不创建num
的另一个副本,这是奇数索引值?
答案 2 :(得分:0)
另一种选择是:
num.map!.with_index {|x,i| i.even? ? 2 * x : x}
答案 3 :(得分:0)
num = [1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8]
even = false
num.map! { |e| (even=!even) ? 2*e : e }
#=> [2, 2, 6, 4, 10, 6, 14, 8, 2, 2, 6, 4, 10, 6, 14, 8]
num
的每个元素都被传递到块中,如果它在num
中的偏移是偶数(2的倍数)并且如果它是奇数则保持不变,则加倍。 (even=!even)
仅将even
的值从true
翻转为false
,从false
翻转为true
。当num
的第一个元素(偏移0
)传递到块中时,even
为false
,因此当true
时它变为(even=!even)
执行。因此该价值翻了一番。当num
的第二个元素(偏移1
)传递给块时,even
将翻转为false
,因此值保持不变,依此类推。