我有一个整数数组,并且尝试将第二个元素乘以数组中向后移动的2。但是,它似乎不接受数组项目上的*运算符,从而导致错误消息:nil:NilClass(NoMethodError)的未定义方法'*'
index = array.length
while index > 0
array[index] * 2
index - 2
end
我已经检查了数组项的类,并且它的确是整数,所以我不确定为什么它不起作用。
谢谢。
答案 0 :(得分:1)
您可以使用索引迭代反转数组,然后反转结果Array#reverse
i % 3
用于将每个第3个元素相乘。
出现示例中的错误undefined method *' for nil:NilClass (NoMethodError)
是因为array.length
是16(数组中的元素),但是索引从0开始,所以最后一个索引是15,在第一次迭代中您尝试访问数组[16]不存在,所以是nil
array = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]
result = array.reverse.each_with_index.map do |x, i|
(i % 3).zero? ? x * 2 : x
end.reverse
# p result
#=> [8, 2, 4, 4, 4, 2, 8, 2, 4, 4, 4, 2, 8, 2, 4, 4]
更新:如果您需要将每个第二个元素相乘,Sekalf Nroc
的答案是odd?
很好,但是例如,如果您有15个元素,则可能会看到意外的结果,因此{{1} }仍然需要向后移动数组,通过结合使用这些方法,您可以执行以下操作:
reverse
答案 1 :(得分:1)
如果按照其他人的建议修复索引,并更改第三和第四行以实际修改数组和索引变量,则您的代码将按预期的方式用于元素数为偶数的任何数组。
index = array.length - 1
while index > 0
array[index] *= 2
index -= 2
end
# array now =='s [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
或者,您可以利用map.with_index
在一行中执行操作,这是利用了数组的第二个元素的索引为奇数的事实。
array.map.with_index { |n, i| i.odd? ? n * 2 : n }
# Or if you prefer,
array.map.with_index { |n, i| if i.odd? then n * 2 else n end }
#=> [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
答案 2 :(得分:0)
您可以使用提供Range#step方法的Range。例如,给定数组:
ary = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]
这是使用Array#reverse_each来“将第二个元素乘以数组中向后移动2的方式”:
(1...ary.size).step(2).each { |i| ary.size.odd? ? ary[i] *=2 : ary[i-1] *=2 }
#=> [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
请注意,第一部分(1...ary.size).step(2).to_a
返回奇数索引:
#=> [1, 3, 5, 7, 9, 11, 13, 15]
还要注意范围内的三个点...
。
对于ary = [2, 4, 2] #=> [2, 8, 2]
对于ary = [2, 4, 2, 4] #=> [4, 4, 4, 4]
答案 3 :(得分:0)
另一种使用Numeric#step的方法。 即使使用另一个步骤(array3),也可以很好地适用于所有示例
array1 = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]
array2 = [2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]
array3 = [2, 4, 4, 2, 4, 4, 2, 4, 4, 2, 4, 4, 2, 4, 4, 2]
(array1.size - 1).step(0, -2).each { |i| array1[i] *= 2 }
(array2.size - 1).step(0, -2).each { |i| array2[i] *= 2 }
(array3.size - 1).step(0, -3).each { |i| array3[i] *= 2 }
p array1, array2, array3
#=>[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
#=>[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
#=>[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]