Как изменить положение элемента массива? - PullRequest
26 голосов
/ 19 января 2011

У меня вопрос о том, как я могу изменить индекс элемента массива, чтобы он пришел не в позицию 7., а в позицию 2 ...

Есть ли функция для этого?

Ответы [ 7 ]

50 голосов
/ 19 января 2011

Нет ничего проще:

array.insert(2, array.delete_at(7))
22 голосов
/ 19 января 2011
irb> a = [2,5,4,6]
=> [2, 5, 4, 6]
irb> a.insert(1,a.delete_at(3))
=> [2, 6, 5, 4]
3 голосов
/ 14 ноября 2017

Если вас не интересует положение других элементов в массиве, вы можете использовать .rotate!(обратите внимание, что! в конце этого метода изменяет фактический массив) метод.

arr = [1, 2, 3, 4, 5, 6, 7, 8]
arr.rotate! -3
arr = [6, 7, 8, 1, 2, 3, 4, 5]

Это берет элемент 8 с индексом 7 и поворачивает его до индекса 2.

2 голосов
/ 16 апреля 2018

Лучший способ ..

array = [4, 5, 6, 7]

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

array # => [7, 5, 6, 4]
2 голосов
/ 07 ноября 2017

Объяснение для начинающих

Эти ответы великолепны.Я искал немного больше объяснения о том, как эти ответы работают.Вот что происходит в ответах выше, как переключать элементы по значению и ссылки на документацию.

# 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_at(index) удаляет элементы по указанному индексу ('7' в нашем примере выше)) и возвращает значение, которое было в этом индексе.Таким образом, запуск arr.delete_at(7) приведет к:

# 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".

Документация

1 голос
/ 26 октября 2018

Ответы здесь не охватывают оба возможных сценария. В то время как вопрос касался индекса origin выше destination, если верно обратное, то решение ниже не будет работать:

array.insert 7, array.delete_at(2)

Это потому, что удаление значения в 2 сдвигает все (выше 2) вниз массива на 1. Теперь наш целевой индекс 7 указывает на то, что было в индексе 8.

Чтобы это исправить, нам нужно проверить, меньше ли origin, чем destination, и если да, вычесть 1 из destination.

origin = 2
destination = 7

destination -= 1 if origin < destination
array.insert destination, array.delete_at(origin)
0 голосов
/ 20 февраля 2017

Не лучше использовать:

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

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...