Ruby 如何更改数组元素的位置?
我有一个问题,关于如何更改数组元素的索引,使其不位于7。位置,但在位置2代替 有没有处理这个问题的函数?没有比这更简单的了: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] ?初学者说明 这些答案很好。我正在寻找更多关于这些答案如何工作的解释。下面是在上面的答案中发生的事情,
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”值
文档
这将获取索引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)