如何获取数组Ruby中的下一个和上一个元素

时间:2019-10-18 06:27:14

标签: ruby-on-rails ruby loops

我有这个数组,需要用上一个和下一个的乘法替换它的元素。

我执行以下操作:

   array.each_with_index{|element, index|
      next_element = array[index+1]
      previous_element = array[index-1]
    }

   array.map! {|a|
      if a == array.first
        a = a * next_element
      elsif a == array.last
        a = a * previous_element
      else
        a = next_element * previous_element
      end
      }

我希望得到以下结果:

array = [4, 1, 6, 7, 9, 3, 0]       #given array
array = [4, 24, 7, 54, 21, 0, 0]    #array replaced

我收到以下错误:

undefined local variable or method `next_element' for Arrays:Class

是否有一种简单的方法来获取给定数组元素的上一个和下一个元素?

我使用array.map!方法对吗?

4 个答案:

答案 0 :(得分:4)

这将起作用:

array = [4, 1, 6, 7, 9, 3, 0]

[nil, *array, nil].each_cons(3).map { |l, m, r| (l || m) * (r || m) }
#=> [4, 24, 7, 54, 21, 0, 0]

该数组被nil值包围,因此每个元素都有邻居。 each_cons(3)然后将每个元素及其相邻元素合并到map,该元素将左边的(l)与右边的(r)乘以,回到中间元素({ {1}}),如果邻居之一恰好是m

答案 1 :(得分:1)

您可以执行以下操作

[array[0..1].inject(:*)] + array[0..-2].map.with_index { |x,i| x * (array[i+2] || array[i+1]) }
# => [4, 24, 7, 54, 21, 0, 0]

答案 2 :(得分:0)

您在循环内定义了next_elementprevious_element,因此它们在末尾变得未定义。这是您的代码的简单解决方法,我假设 您想保持第一个和最后一个元素不变。您不需要使用map

array.each_with_index do |element, index|   
  if element != array.first && element != array.last
    array[index] = array[index+1] * array[index-1]      
  end 
end 

array => [4, 24, 168, 1512, 4536, 0, 0]

这不是您所期望的,为什么?由于您的元素array[index]在每次迭代后都会更改,因此您可以在每次迭代后打印数组以查看结果

我建议您像这样使用另一个数组保存数组的值

b =[]
array.each_with_index do |element, index|
  b[index] = array[index]
    if element != array.first && element != array.last
  b[index] = array[index+1] * array[index-1]
  end
end

答案 3 :(得分:0)

似乎each_cons似乎很合适:

[array.first] + array.each_cons(3).map { |p, _, n| p * n } + [array.last]
#=> [4, 24, 7, 54, 21, 0, 0]

这需要更多的工作(例如,如果数组为空,则将返回[nil, nil]),但是我敢肯定,您可以弄清楚这些边缘情况。