给定n个元素的数组,即
var array = [1, 2, 3, 4, 5]
我可以编写一个扩展,Array以便可以修改数组以实现以下输出[2, 3, 4, 5, 1]:
Array
[2, 3, 4, 5, 1]
mutating func shiftRight() { append(removeFirst()) }
有没有一种方法可以实现将数组移动任何索引(正数或负数)的功能。我可以使用if-else子句以命令式方式实现此功能,但我正在寻找的是功能性实现。
if-else
该算法很简单:
有什么方法可以以功能样式实现它吗?
我完成的代码:
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]) } }
您可以使用远程下标并连接结果。这将为您提供所需的名称,其名称类似于标准库:
extension Array { func shiftRight(var amount: Int = 1) -> [Element] { assert(-count...count ~= amount, "Shift amount out of bounds") if amount < 0 { amount += count } // this needs to be >= 0 return Array(self[amount ..< count] + self[0 ..< amount]) } mutating func shiftRightInPlace(amount: Int = 1) { self = shiftRight(amount) } } Array(1...10).shiftRight() // [2, 3, 4, 5, 6, 7, 8, 9, 10, 1] Array(1...10).shiftRight(7) // [8, 9, 10, 1, 2, 3, 4, 5, 6, 7]
除了下标,您还可以Array(suffix(count - amount) + prefix(amount))从返回shiftRight()。
Array(suffix(count - amount) + prefix(amount))
shiftRight()