在while循环ruby中多次使用数组ELEMENT

问题描述 投票:1回答:4

我有一个整数数组,我试图将每个第二个元素乘以2在数组中向后移动。但是,它似乎不接受数组项上的*运算符,导致错误消息:nil的未定义方法`*':NilClass(NoMethodError)

 index = array.length
  while index > 0
    array[index] * 2
    index - 2
  end

我检查了数组项的类,它确实是一个整数,所以我不确定为什么这不起作用。

谢谢。

ruby loops class operators
4个回答
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]

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 Nrocodd?的回答是好的,如果你需要每个第二个元素相乘,但如果你有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]

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]

0
投票

您可以使用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]

© www.soinside.com 2019 - 2024. All rights reserved.