从数组中删除元素,修改它们,然后将它们放回去

时间:2014-08-12 19:55:38

标签: ruby arrays

我有一个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?},因为它实际上并没有修改原始数组。

4 个答案:

答案 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)传递到块中时,evenfalse,因此当true时它变为(even=!even)执行。因此该价值翻了一番。当num的第二个元素(偏移1)传递给块时,even将翻转为false,因此值保持不变,依此类推。