将数组的偶数索引元素乘以2,将数组的奇数索引元素乘以3?

时间:2014-06-27 14:02:06

标签: ruby arrays

我有以下数组,其中包含1到10之间的所有数字:

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

我希望将每个偶数索引元素乘以2,将每个奇数索引元素乘以3.我希望我的数组看起来像:

[2,6,6,12,10,18,14,24,18,30]

我尝试了以下解决方案:

numbers.select do |x|
  if x.even?
    x * 2
  else
    x * 3
  end
  puts x
end

不幸的是,这不起作用。有没有人有更好的方法?

7 个答案:

答案 0 :(得分:3)

看起来你希望每个偶数索引乘以2,奇数索引乘以3。

这应该可以解决问题

numbers = [1,2,3,4,5,6,7,8,9,10]
numbers.map!.with_index { |n, i| i.even? ? n * 2 : n * 3 }
p numbers
# => [2,6,6,12,10,18,14,24,18,30]

对于您的尝试,只要块的结果为true,#select 就会从枚举器中选择元素。如果要修改枚举器,则应使用#map!#with_index方法可供所有枚举器使用,以在块中包含索引。

答案 1 :(得分:3)

numbers.map.with_index { |n, i| n * (i.even? ? 2 : 3) }
=> [2, 6, 6, 12, 10, 18, 14, 24, 18, 30]

答案 2 :(得分:1)

您的区块不是返回x * 2或x * 3,而是puts x的结果。您需要删除该行的这一行。

答案 3 :(得分:0)

Array#select根据块中代码的评估过滤数组。如果块返回“truthy”值(任何不是falsenil的值),则保留该元素,否则将其丢弃。

你想要的是map方法。 map返回一个由块返回填充的新数组。

[1,2,3,4,5,6,7,8,9,10].map { |x| x.even? ? x * 2 : x * 3 }

答案 4 :(得分:0)

稍微打高尔夫球:

numbers = [1,2,3,4,5,6,7,8,9,10]
puts numbers.each_with_index.map{|n, i| n * (2 + i % 2) }

答案 5 :(得分:0)

以下是使用cycle的方法:

multiply_by = [2, 3].cycle
numbers.map { |n| n * multiply_by.next }
# => [2, 6, 6, 12, 10, 18, 14, 24, 18, 30]

答案 6 :(得分:0)

这是JavaScript中的解决方案。

  

function ModifyArray(nums){           返回nums.map(num => num%2 == 0?num * 2:num * 3)       }