Метод Ruby для перемещения массива вправо

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Существует ли метод ruby, который будет циклически перемещать каждый элемент в массиве вправо на определенное число?

Например, если он принимает массив [1,2,3,4] и номер сдвига 1, возвращает [4,1,2,3] .
Или, если он принимает массив [1,2,3,4,5] и номер сдвига 2, возвращает [4,5,1,2,3] .

Я мог бы сам создать этот метод, но у ruby обычно уже есть метод для такого рода вещей. У меня возникли проблемы с его поиском, поскольку я не знаю, как он будет называться. Методы array cycle и shift не имеют такого поведения.

Комментарии:

1. Если вы просматривали Array методы, прежде чем задавать вопрос, разве вам не было интересно узнать о том, который называется «повернуть»?

Ответ №1:

Вы можете использовать rotate метод, который выполняет аналогичные действия

 2.6.5 :012 > arr = [1,2,3,4]
 => [1, 2, 3, 4]
2.6.5 :013 > arr.rotate
 => [2, 3, 4, 1]
2.6.5 :014 > arr = [1,2,3,4,5]
 => [1, 2, 3, 4, 5]
2.6.5 :015 > arr.rotate(2)
 => [3, 4, 5, 1, 2]
  

Например :-

 2.6.5 :021 > def array_rotation(array, shift = 1)
2.6.5 :022?>     array.rotate(- shift)
2.6.5 :023?>   end
 => :array_rotation
2.6.5 :024 > arr = [1,2,3,4,5]
 => [1, 2, 3, 4, 5]
2.6.5 :025 > array_rotation arr, 2
 => [4, 5, 1, 2, 3]
2.6.5 :026 > arr = [1,2,3,4]
 => [1, 2, 3, 4]
2.6.5 :027 > array_rotation arr, 1
 => [4, 1, 2, 3]
  

Комментарии:

1. На мой взгляд, нет причин создавать новый метод только для того, чтобы перевернуть целое число с положительного на отрицательное. Я бы использовал array.rotate(-n) , где array это массив и n количество элементов для поворота назад.

2. @3limin4t0r : Полностью согласен. Добавлен метод только для удовлетворения заданных условий.

3. Вопрос не требует создания метода. Фактически, OP хочет использовать существующий метод, если он есть. Учитывая, что вы «полностью согласны» с @3limin4t0r, я предлагаю вам отредактировать свой ответ и просто указать, что существует такой метод : Array#rotate . В редактировании нет необходимости упоминать, что это редактирование. Если вы хотите поблагодарить кого-то за предложение, я предлагаю вам сделать это в комментарии, а не в ответе, чтобы сохранить последнее «чистым».

Ответ №2:

Я полагаю, вы ищете метод #rotate .

Вы можете использовать его примерно так

 array.rotate(-shift)
  

Комментарии:

1. Спасибо, именно то, что я ищу!

2. shift_rotate([1,2,3,4,5], 2) #=> [3, 4, 5, 1, 2] , нет [4, 5, 1, 2, 3] . Было бы проще написать array.rotate(-shift) . На самом деле, зачем вообще создавать метод shift_rotate , а не просто писать array.rotate(-shift) ?

3. @CarySwoveland Я согласен с вами, array.rotate(-shift) но я не уверен, почему вы получаете другой результат, чем я, от этого метода, могу я попросить вас поделиться своей версией Ruby?

4. @CarySwoveland shift_rotate([1,2,3,4,5], 2) #=> [3, 4, 5, 1, 2] в случае, если вы напишете: `array.rotate (shift — array.size)` это не то же самое, что я сделал 🙂

5. Мой плохой, или это я плохой? Вычеркните первое предложение моего первого комментария.