一尘不染

按索引移动数组中的元素

swift

给定n个元素的数组,即

var array = [1, 2, 3, 4, 5]

我可以编写一个扩展,Array以便可以修改数组以实现以下输出[2, 3, 4, 5, 1]

mutating func shiftRight() {
  append(removeFirst())
}

有没有一种方法可以实现将数组移动任何索引(正数或负数)的功能。我可以使用if-else子句以命令式方式实现此功能,但我正在寻找的是功能性实现。

该算法很简单:

  1. 通过提供的索引将数组分为两个
  2. 将第一个数组附加到第二个数组的末尾

有什么方法可以以功能样式实现它吗?

我完成的代码:

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])
  }
}

阅读 260

收藏
2020-07-07

共1个答案

一尘不染

您可以使用远程下标并连接结果。这将为您提供所需的名称,其名称类似于标准库:

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()

2020-07-07