Ruby 如何更改数组元素的位置?

Ruby 如何更改数组元素的位置?,ruby,arrays,Ruby,Arrays,我有一个问题,关于如何更改数组元素的索引,使其不位于7。位置,但在位置2代替 有没有处理这个问题的函数?没有比这更简单的了: array.insert(2, array.delete_at(7)) 不是更好地使用: irb> a = [2,5,4,6] #=> [2, 5, 4, 6] irb> a.insert(1, a.pop) #=> [2, 6, 5, 4] ?初学者说明 这些答案很好。我正在寻找更多关于这些答案如何工作的解释。下面是在上面的答案中发生的事情,

我有一个问题,关于如何更改数组元素的索引,使其不位于7。位置,但在位置2代替

有没有处理这个问题的函数?

没有比这更简单的了:

array.insert(2, array.delete_at(7))
不是更好地使用:

irb> a = [2,5,4,6]
#=> [2, 5, 4, 6]
irb> a.insert(1, a.pop)
#=> [2, 6, 5, 4]

初学者说明 这些答案很好。我正在寻找更多关于这些答案如何工作的解释。下面是在上面的答案中发生的事情,如何按值切换元素,以及到文档的链接

# sample array
arr = ["a", "b", "c", "d", "e", "f", "g", "h"]

# suppose we want to move "h" element in position 7 to position 2 (trekd's answer)
arr = arr.insert(2, arr.delete_at(7))
=> ["a", "b", "h", "c", "d", "e", "f", "g"]
这是因为
arr.delete\u at(index)
删除指定索引处的元素(在上面的示例中为“7”),并返回该索引中的值。因此,在(7)处运行
arr.delete_
将产生:

# returns the deleted element
arr.delete_at(7) 
=> "h"           

# array without "h"
arr
=> ["a", "b", "c", "d", "e", "f", "g"]
把它放在一起,
insert
方法现在将把这个“h”元素放在位置2。为了清晰起见,将其分为两个步骤:

# delete the element in position 7
element = arr.delete_at(7)  # "h"
arr.insert(2, element)
=> ["a", "b", "h", "c", "d", "e", "f", "g"]
按值排列的开关元件 假设要将数组中的值为“h”的元素(无论其位置如何)移动到位置2。这可以通过索引方法轻松实现:

arr = arr.insert(2, arr.delete_at( arr.index("h") ))
注意:以上假设数组中只有一个“h”值

文档

如果您不关心阵列中其他元素的位置,可以使用.rotate!(请注意,此方法末尾的!更改了实际数组)方法


这将获取索引7处的元素8,并将其旋转为索引2。

如果要交换,最好的方法是:

array = [4, 5, 6, 7]

array[0], array[3] = array[3], array[0]

array # => [7, 5, 6, 4]

这里的答案不包括两种可能的情况。虽然问题涉及的是
起点
索引高于
目的地
,但如果相反,则以下解决方案将不起作用:

array.insert 7, array.delete_at(2)
这是因为删除2处的值会将数组中的所有值(大于2)向下移动1。现在,我们的目的地索引7指向了以前的索引8

要解决此问题,我们需要检查
起点
是否小于
目的地
,如果是,则从
目的地
中减去1

origin = 2
destination = 7

destination -= 1 if origin < destination
array.insert destination, array.delete_at(origin)
origin=2
目的地=7
如果起点<终点,则终点-=1
array.insert目标,array.delete_位于(原点)

谢谢您的正确回答。我给了特雷克德正确的答案,因为他仍然有新手奖金。好了,现在倒转方向。位置2到位置7。也许不像你想象的那么简单。如果你从一个在你插入的索引之前的索引移动,这就不起作用了!删除操作将发生在插入之前,因此您需要在插入之前考虑元素的移动。上述注释是错误的,这种方法在所有情况下都有效。你自己在irb里试试。这个答案是误导性的。虽然它可以工作,并且回答了这个问题,@wizzard是正确的,因为它并不适用于所有场景。请参阅下面我的答案,了解一种在源索引小于目标索引的情况下有效的方法。这仅在您想移动最后一个元素时有效,但在您想移动另一个元素时无效:)虽然很整洁,但这会交换两个位置,而不是原始海报所要求的位置。他们想把第7项移到第2项。所以从技术上讲,这并不能回答问题。按值切换元素->如果你有更多的“h”@AdamLudian,你只需要具体说明你想要的行为。例如,如果您的数组有多个“h”值,那么您可能根本不想运行此代码。
array.insert 7, array.delete_at(2)
origin = 2
destination = 7

destination -= 1 if origin < destination
array.insert destination, array.delete_at(origin)