在Ruby中按索引移动元素

时间:2015-01-30 19:26:36

标签: ruby

arr = [50, 30, "+"]

我想移动" +"通过迭代在50到30之间。

我认为each_with_index可以做到这一点,但到目前为止还没有运气。这是制作反向波兰表示法的过程的一部分。 (如果有人有兴趣,http://en.wikipedia.org/wiki/Reverse_Polish_notation

def evaluate(arr)
   arr.each_with_index {|ele, index| index-1 if x=="+"} 
end

我想将=-*等运算符移动一个索引,以便返回50 - 30。谢谢!

4 个答案:

答案 0 :(得分:3)

arr.values_at(0, 2, 1)
#=> [50, "+", 30]

arr.values_at(0, 2, 1).join(" ")
#=> "50 + 30"

答案 1 :(得分:1)

我这样做:

arr[-1], arr[-2] = arr[-2], arr[-1]

这会交换数组的最后两个元素。

答案 2 :(得分:0)

您可以创建一个临时数组:

def evaluate(arr)
   temp = arr.dup
   arr.each_with_index { |ele, index| temp[index-1] = ele }
   temp 
end

另一种方法是重复数组两次并抓住索引1-3处的元素:

(arr * 2)[1..3]

答案 3 :(得分:0)

这并没有直接回答你的问题,但是如果你想在Ruby中实现RPN,你就不需要做任何数组修改。您可以迭代您的操作并直接维护您的价值堆栈:

def rpn(*ops)
  stack = []
  ops.each do |op|
    case op
    when Numeric
      stack.push op
    else
      value = stack.pop
      receiver = stack.pop
      stack.push receiver.send(op, value)
    end
  end
  stack.first
end

puts rpn 5, 1, 2, "+", 4, "*", "+", 3, "-" # => 14

有趣的是,由于这是Ruby,操作只是发送给接收者的消息,所以你可以做超出基本数学的事情 - 例如,为了获得两个数字的最大公分母,Ruby提供了&# 34; GCD"方法,您可以将其输入RPN解析器!

puts rpn 64, 24, "gcd" # => 8