如何在Swift中将数组拆分成两半?

Irr*_*oxy 15 arrays swift

我如何拆分一副牌?我有一个阵列和一个随机卡经销商,但不知道如何拆分甲板.

谢谢大家的帮助!我现在有一个工作卡应用程序,确实遇到了其他问题,但他们很快就解决了.

aya*_*aio 19

您可以进行扩展,以便它可以返回两个数组的数组,使用Ints,Strings等:

extension Array {
    func split() -> [[Element]] {
        let ct = self.count
        let half = ct / 2
        let leftSplit = self[0 ..< half]
        let rightSplit = self[half ..< ct]
        return [Array(leftSplit), Array(rightSplit)]
    }
}

let deck = ["J", "Q", "K", "A"]
let nums = [0, 1, 2, 3, 4]

deck.split() // [["J", "Q"], ["K", "A"]]
nums.split() // [[0, 1], [2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)

但返回一个命名元组甚至更好,因为它强制执行一个事实,即你期望正好两个数组:

extension Array {
    func split() -> (left: [Element], right: [Element]) {
        let ct = self.count
        let half = ct / 2
        let leftSplit = self[0 ..< half]
        let rightSplit = self[half ..< ct]
        return (left: Array(leftSplit), right: Array(rightSplit))
    }
}

let deck = ["J", "Q", "K", "A"]

let splitDeck = deck.split()
print(splitDeck.left) // ["J", "Q"]
print(splitDeck.right) // ["K", "A"]
Run Code Online (Sandbox Code Playgroud)

注意:获得第一个正确答案的是Andrei和Qbyte,我只是添加信息.


And*_*uca 13

您可以使用下标范围

let deck: [String] = ["J", "Q", "K", "A"]

// use ArraySlice only for transient computation
let leftSplit: ArraySlice<String> = deck[0 ..< deck.count / 2] // "J", "Q"
let rightSplit: ArraySlice<String> = deck[deck.count / 2 ..< deck.count] // "K", "A"

// make arrays from ArraySlice
let leftDeck: [String] = Array(leftSplit) // "J", "Q"
let rightDeck: [String] = Array(rightSplit) // "K", "A"
Run Code Online (Sandbox Code Playgroud)

编辑:上面的代码是针对Swift 2,也许对于Swift 3来说是一种更方便的方式.


dim*_*mdy 9

迅速

将数组拆分为大块的更通用的解决方案,来自此链接的答案

extension Array {
    func chunked(into size: Int) -> [[Element]] {
        return stride(from: 0, to: count, by: size).map {
            Array(self[$0 ..< Swift.min($0 + size, count)])
        }
    }
}
let numbers = Array(1...100)
let result = numbers.chunked(into: 5)
Run Code Online (Sandbox Code Playgroud)


Dre*_*ren 6

以及对先前提供的想法的又一实现。首先,就 Swift 当前文档而言,最好为产生某些结果的函数选择过去简单时态的名称,为变异函数选择现在时态的名称。其次,对于我来说,最好选择一半添加计数%2以获得更均匀的结果。

就这个:

extension Array {
    func devided() -> ([Element], [Element]) {
        let half = count / 2 + count % 2
        let head = self[0..<half]
        let tail = self[half..<count]

        return (Array(head), Array(tail))
    }
}
Run Code Online (Sandbox Code Playgroud)

和结果:

let set1 = [1, 2, 3, 4, 5, 6, 7,8]
let set2 = [1, 2, 3, 4, 5]
let set3 = [1]
let set4 = [Int]()

print(set1.devided())
print(set2.devided())
print(set3.devided())
print(set4.devided())

([1, 2, 3, 4], [5, 6, 7, 8])
([1, 2, 3], [4, 5])
([1], [])
([], [])
Run Code Online (Sandbox Code Playgroud)

  • “分裂”的过去式仍然是“分裂”。要遵循您所引用的指南,最好找到 split 的同义词,它会在过去时态中产生不同的拼写。 (2认同)