我们得到:
arr = ['a', 'b', 'c', 'd', 'f', 'g']
最初我假设您希望修改(变异)arr(而不是创建一个新数组并保持arr 不受干扰)。后来我构造了一个不会变异的方法arr。
让我们首先构造一个方法,该方法将要移动的元素的索引、要跟随的元素的索引,当然还有数组作为参数:
def move_position(arr, n1, right_of:)
arr.insert(right_of, arr.delete_at(n1))
end
试试看。
move_position(arr, 1, right_of: 3)
#=> ["a", "c", "d", "b", "f", "g"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 3)
#=> ["b", "c", "d", "a", "f", "g"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 5)
#=> ["b", "c", "d", "f", "g", "a"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 0)
#=> ["a", "b", "c", "d", "f", "g"]
见Array#index。请注意arr.index(i,o) 在索引i 处插入o 之前 元素,但因为
a = arr.delete_at(n1)
在之前执行
arr.insert(right_of, a)
o 插入 最初位于索引 i 的元素之后。
注意right_of:在
def move_position(arr, n1, right_of:)
指定:right_of 的值是一个必需的 变量(没有默认值,当使用right_of: 3 时)。 命名参数(或参数)是在 Ruby v2.0 中引入的。在 Ruby v2.1 中添加了使命名参数成为必需的语法。
现在创建一个方法,用在这些索引处找到的元素替换这两个索引。当然,这仅在涉及的两个元素在数组中是唯一的情况下才有效。
def move_element(arr, e1, right_of:)
move_position(arr, arr.index(e1), right_of: arr.index(right_of))
end
这个这个方法。
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'b', right_of: 'd')
#=> ["a", "c", "d", "b", "f", "g"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'd')
#=> ["b", "c", "d", "a", "f", "g"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'g')
#=> ["b", "c", "d", "f", "g", "a"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'a')
#=> ["a", "b", "c", "d", "f", "g"]
如果您不想改变arr,您可以编写以下内容:
def move_position(arr, n1, right_of:)
arr.each_index.map do |i|
case i
when 0..n1-1, (right_of+1)..arr.size-1
arr[i]
when n1..right_of-1
arr[i+1]
when right_of
arr[n1]
end
end
end
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 1, right_of: 3)
#=> ["a", "c", "d", "b", "f", "g"]
move_position(arr, 0, right_of: 3)
#=> ["b", "c", "d", "a", "f", "g"]
move_position(arr, 0, right_of: 5)
#=> ["b", "c", "d", "f", "g", "a"]
move_position(arr, 0, right_of: 0)
#=> ["a", "b", "c", "d", "f", "g"]
确认arr没有被变异:
arr
#=> ["a", "b", "c", "d", "f", "g"]
move_element 不变:
move_element(arr, 'b', right_of: 'd')
#=> ["a", "c", "d", "b", "f", "g"]
move_element(arr, 'a', right_of: 'd')
#=> ["b", "c", "d", "a", "f", "g"]
move_element(arr, 'a', right_of: 'g')
#=> ["b", "c", "d", "f", "g", "a"]
move_element(arr, 'a', right_of: 'a')
#=> ['a', 'b', 'c', 'd', 'f', 'g']
arr
#=> ['a', 'b', 'c', 'd', 'f', 'g']