因此,我想通过传递到方法中的条件参数引用特定位置来移动数组的给定元素。
例如,如果我有一个数组
array = [a, b, c, d, f, g]
并按照此方法创建了一个方法,并以键值对作为条件
def move_element(a, right_of: d)
end
这可以通过 Ruby 中的给定数组方法实现吗?如果是这样我就不熟悉了。
提前干杯
最佳答案
我们得到:
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']
关于arrays - Ruby - 将数组元素移动到给定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64814991/