首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移位捷变阵列

移位捷变阵列
EN

Stack Overflow用户
提问于 2015-07-22 05:38:32
回答 5查看 9.1K关注 0票数 6

颜色排列

代码语言:javascript
复制
let colorArray = [
    UIColor.redColor(),
    UIColor.orangeColor(),
    UIColor.yellowColor(),
    UIColor.greenColor(),
    UIColor.blueColor()
]

其目标是移动数组:

  1. 从不同的颜色开始。
  2. 以保持颜色的圆形顺序。

示例1

如果我们想从橙色(原始数组中索引1处的颜色)开始,数组将如下所示:

代码语言:javascript
复制
let colorArray = [
    UIColor.orangeColor(),
    UIColor.yellowColor(),
    UIColor.greenColor(),
    UIColor.blueColor(),
    UIColor.redColor(),
]

例2

如果我们想从绿色(原始数组中索引3处的颜色)开始,数组将如下所示:

代码语言:javascript
复制
let colorArray = [
    UIColor.greenColor(),
    UIColor.blueColor(),
    UIColor.redColor(),
    UIColor.orangeColor(),
    UIColor.yellowColor()
]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-24 17:29:15

我想出的Swift 3& 4解决方案:

代码语言:javascript
复制
extension Array {

    func shifted(by shiftAmount: Int) -> Array<Element> {

        // 1
        guard self.count > 0, (shiftAmount % self.count) != 0 else { return self }

        // 2
        let moduloShiftAmount = shiftAmount % self.count
        let negativeShift = shiftAmount < 0
        let effectiveShiftAmount = negativeShift ? moduloShiftAmount + self.count : moduloShiftAmount

        // 3
        let shift: (Int) -> Int = { return $0 + effectiveShiftAmount >= self.count ? $0 + effectiveShiftAmount - self.count : $0 + effectiveShiftAmount }

        // 4
        return self.enumerated().sorted(by: { shift($0.offset) < shift($1.offset) }).map { $0.element }

    }

}

解释:

  1. 没有生成原始数组标识的元素和移位的数组将立即返回。
  2. 为了得到有效的移位量,不管函数传递的数量是多少,我们做了一些模块计算,以消除多次旋转数组中元素的移位(例如,在有5个对象的数组中,+7的移位与+2的移位相同)。由于我们总是想向右移动,为了用一个简单的函数代替两个函数,必须处理负输入(例如,在一个有5个对象的数组中,-2的移位等于+3的移位)。因此,我们根据阵列的长度来调整模计算的负结果。当然,这3行可以一次完成,但我想让它尽可能地可读性。
  3. 现在,我们通过获取元素的索引($0)来准备实际的移位,并通过添加步骤2中的计算量来返回移位的索引。如果新的索引落在数组长度之外,则需要将其封装到前面。
  4. 最后,我们用一些技巧将所有准备工作应用到数组中:enumerated()给出了一个元组[(offset: Int, element: Int)]数组,它只是每个元素和元素本身的原始索引。然后,通过应用步骤3中的函数,通过被操纵的offset (也就是元素的索引)对这个枚举数组进行排序。最后,我们通过将排序的元素映射回一个数组来消除枚举。

此扩展适用于任何类型的数组。示例:

代码语言:javascript
复制
let colorArray = [
    UIColor.red,
    UIColor.orange,
    UIColor.yellow,
    UIColor.green,
    UIColor.blue
]

let shiftedColorArray = [
    UIColor.green,
    UIColor.blue,
    UIColor.red,
    UIColor.orange,
    UIColor.yellow
]

colorArray.shifted(by: 2) == shiftedColorArray // returns true

[1,2,3,4,5,6,7].shifted(by: -23) // returns [3,4,5,6,7,1,2]
票数 9
EN

Stack Overflow用户

发布于 2015-09-27 07:15:00

我知道这可能要晚了。但是,旋转或移动数组的最简单方法是

代码语言:javascript
复制
func shifter(shiftIndex: Int) {
   let strArr: [String] = ["a","b","c","d"]
   var newArr = strArr[shiftIndex..<strArr.count]
   newArr += strArr[0..<shiftIndex]       
   println(newArr)  }

shifter(2) //[c, d, a, b] you can modify the function to take array as input
票数 10
EN

Stack Overflow用户

发布于 2015-07-22 06:18:33

您可以扩展Array以包括一个方法,以返回包含由一个元素旋转的原始数组元素的数组:

代码语言:javascript
复制
extension Array {
    func rotate(shift:Int) -> Array {
        var array = Array()
        if (self.count > 0) {
            array = self
            if (shift > 0) {
                for i in 1...shift {
                    array.append(array.removeAtIndex(0))
                }
            }
            else if (shift < 0) {
                for i in 1...abs(shift) {
                    array.insert(array.removeAtIndex(array.count-1),atIndex:0)
                }
            }
        }
        return array
    }
}

将数组的元素移动一次

代码语言:javascript
复制
let colorArray:[UIColor] = [
    .redColor(),
    .orangeColor(),
    .yellowColor(),
    .greenColor(),
    .blueColor()
]

let z = colorArray.rotate(1)

// z is [.orangeColor(), .yellowColor(), .greenColor(), .blueColor(), .redColor()]

两次

代码语言:javascript
复制
let z = colorArray.rotate(2)

// z is [.yellowColor(), .greenColor(), .blueColor(), .redColor(), .orangeColor()]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31554670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档