我有一个整数数组,我试图将每个第二个元素乘以2在数组中向后移动。但是,它似乎不接受数组项上的*运算符,导致错误消息:nil的未定义方法`*':NilClass(NoMethodError)
index = array.length
while index > 0
array[index] * 2
index - 2
end
我检查了数组项的类,它确实是一个整数,所以我不确定为什么这不起作用。
谢谢。
如果您像其他人建议的那样修复索引,并更改第三行和第四行以实际修改数组和索引变量,那么您的代码将按预期用于具有偶数元素的任何数组。
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]
您可以使用索引迭代反向数组,然后反向结果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个元素,你可以看到意想不到的结果,所以reverse
仍然需要向后走数组,通过结合这些方法,你可以做点什么像这样:
array = [4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 99]
p array.map.with_index { |n, i| i.odd? ? n * 2 : n } # WRONG RESULT
#=>[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 99]
p array.reverse.map.with_index { |n, i| i.even? ? n * 2 : n }.reverse
#=>[8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 198]
另一种方法,使用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]
您可以使用Range,它提供Range#step方法。例如,给定数组:
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]