Учитывая массив из п элементов, т.е.сдвига элементов в массиве по индексу
var array = [1, 2, 3, 4, 5]
Я могу написать расширение к Array
так что я могу изменить массив для достижения этого результата: [2, 3, 4, 5, 1]
:
mutating func shiftRight() {
append(removeFirst())
}
Есть ли способ реализовать такую функцию, которая будет смещать массив по любому индексу, положительному или отрицательному. Я могу реализовать эту функцию в императивном стиле с предложениями if-else
, но то, что я ищу, - это функциональная реализация.
Алгоритм прост:
- Split массив на две части индекса при условии
- добавить первый массив к концу второго
Есть ли способ, чтобы реализовать его в функциональный стиль?
код я закончил с:
extension Array {
mutating func shift(var amount: Int) {
guard -count...count ~= amount else { return }
if amount < 0 { amount += count }
self = Array(self[amount ..< count] + self[0 ..< amount])
}
}
Отличное решение. Функция, которую я закончил, немного отличается, но мне особенно нравится, как вы относитесь к сдвигу, если величина сдвига отрицательная. –
Я добавил код, с которым я закончил, на мой вопрос. Это немного по-другому, но идея точно такая же. –
Удобное решение! Я бы переименовал функцию, потому что сдвиг не произошел. Я понимаю, что это подразумевает его мутационную характеристику. –