首页 > 解决方案 > 如何拆分奇数数组

问题描述

如果我有一个数组[-23,0,43,7,5,2,4],如何拆分数组 [奇数] [偶数]。我想要第一个数组中的 4 个元素和第二个数组中的 3 个元素。

我试图做这样的事情:

let leftArray = Array(mainArray[0..<mainArray.count/2])
let rightArray = Array(mainArray[mainArray.count/2..<mainArray.count])

我不断得到[-23,0,43][7,5,2,4]

标签: arraysswift

解决方案


我想你想把你的数组分成中间,对于奇数,让第一部分更大。使用这样的函数(故意拼写非常明确):

func splitArray(_ arr: [Int]) -> ([Int], [Int]) {
    let count = arr.count
    let half = count.isMultiple(of: 2) ? count / 2 : count / 2 + 1
    let left = arr[0..<half]
    let right = arr[half..<count]
    return (Array(left), Array(right))
}

splitArray([-23,0,43,7,5,2,4])   // ([-23, 0, 43, 7], [5, 2, 4])
splitArray([-23,0,43,7,5,2,4,1]) // ([-23, 0, 43, 7], [5, 2, 4, 1])

这可以被简化并变得通用(即,适用于各种集合),如下所示:


extension Collection {
    func splitHalf() -> (SubSequence, SubSequence) {
        let count = self.count
        let left = self.prefix(count / 2 + count % 2)
        let right = self.suffix(count / 2)
        return (left, right)
    }
}

[-23,0,43,7,5,2,4].splitHalf()   // ([-23, 0, 43, 7], [5, 2, 4])
[-23,0,43,7,5,2,4,1].splitHalf() // ([-23, 0, 43, 7], [5, 2, 4, 1])
"12345".splitHalf() // (.0 "123", .1 "45")
"123456".splitHalf() // (.0 "123", .1 "456")

推荐阅读