Как переместить индекс / позицию элемента в массиве и соответственно перемешать другие? - PullRequest
0 голосов
/ 07 декабря 2018

Мне было интересно, может ли кто-нибудь объяснить, как перемещать элементы в массиве в Ruby?

Например,

array = [a, b, c, d, e, f, l]

затем становится

array = [b, c, d, e, f, a, l]

Я хочу переместить «a» туда, где «f»есть, но я не хочу их переключать.Я хочу переместить «a» в эту позицию и иметь «f» и все перед тем, как он перемещается вниз по массиву, в то время как элементы перед ним, такие как «l», остаются на своих местах.В этом конкретном сценарии дубликаты не существуют.Кроме того, нет необходимости сохранять копию исходного массива без изменений.

*, приведенные в порядок для уточнения

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вы можете сделать это, удалив 'a' из массива и вставив его обратно с индексом 'f' + 1. Имейте в виду, что порядок кода ниже важен, так как индексы сдвигаются после удаления элемента.

array   = %w[a b c d e f l]
deleted = array.delete('a') # returns nil if not found
index   = array.index('f')  # returns nil if not found
array.insert(index + 1, deleted)
#=> ["b", "c", "d", "e", "f", "a", "l"]

Если вы измените это на однострочное, вы получите неверный результат.

array.insert(array.index('f') + 1, array.delete('a'))
#=> ["b", "c", "d", "e", "f", "l", "a"]
#                                   ^ 'a' is placed one position to far

Причина этого заключается в том, что порядок выполнения index -> (добавление индекса) -> удалить -> вставить .Это можно исправить, удалив + 1.Однако это относится только к случаю, когда 'f' присутствует после 'a'.

array = %w[f b c d e a l]
array.insert(array.index('f'), array.delete('a'))
#=> ["a", "f", "b", "c", "d", "e", "l"]
#     ^ 'a' is placed before 'f' (+ 1 is needed here)

Кроме того, у вас также могут возникнуть проблемы, если один из элементов не будет найден, поскольку результатом index или delete может быть nil.Выполнение этой мультилинии позволяет вам обрабатывать исключения, возвращая ваш метод раньше.

0 голосов
/ 07 декабря 2018

Это решает ваш запрос на:

"первый элемент на определенную позицию"

def move_first_element(a, x)
  first = a.shift
  a.insert(x, first)
end 

, если вы запустите это:

(0..6).each do |i|
  a = [0,1,2,3,4,5,6]
  move_first_element(a, i)
  puts "First element to index: #{i}"
  puts "#{a}"
end

результаты:

First element to index: 0
[0, 1, 2, 3, 4, 5, 6]
First element to index: 1
[1, 0, 2, 3, 4, 5, 6]
First element to index: 2
[1, 2, 0, 3, 4, 5, 6]
First element to index: 3
[1, 2, 3, 0, 4, 5, 6]
First element to index: 4
[1, 2, 3, 4, 0, 5, 6]
First element to index: 5
[1, 2, 3, 4, 5, 0, 6]
First element to index: 6
[1, 2, 3, 4, 5, 6, 0]
0 голосов
/ 07 декабря 2018

Вы хотите вставить перед "l", то есть позицией 6.

array = ["a", "b" ,"c", "d", "e", "f", "l"]
array.insert(5,array.shift)
=> ["b" ,"c", "d", "e", "f", "a", "l"]

Обратите внимание, что мы указали позицию 5, потому что после удаления первого элемента (array.shift) новая нумерация имеет "l "в положении 5 (где раньше это было положение 6).

Если вы делали это в отдельных шагах ...

array = ["a", "b" ,"c", "d", "e", "f", "l"]
character_to_shift = array.shift # shift method removes and returns first entry in array
=> "a"
p array
=> ["b" ,"c", "d", "e", "f", "l"]
p.insert(5, character_to_shift) # insert inserts specified character at index position
    => ["b" ,"c", "d", "e", "f", "a", "l"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...