ios - Swift:将 [String] 拆分为具有给定子数组大小的 [[String]] 的正确方法是什么?

标签 ios swift algorithm

从一个大的 [String] 和给定的子数组大小开始,我可以将该数组拆分为更小的数组的最佳方法是什么? (最后一个数组将小于给定的子数组大小)。

具体示例:

Split up ["1","2","3","4","5","6","7"] with max split size 2

The code would produce [["1","2"],["3","4"],["5","6"],["7"]]

显然我可以更手动地完成此操作,但我觉得像map()或reduce()这样的快速方法可以非常漂亮地完成我想要的事情。

最佳答案

在 Swift 3/4 中,这将如下所示:

let numbers = ["1","2","3","4","5","6","7"]
let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map {
    Array(numbers[$0..<min($0 + chunkSize, numbers.count)])
}
// prints as [["1", "2"], ["3", "4"], ["5", "6"], ["7"]]

作为数组的扩展:

extension Array {
    func chunked(by chunkSize: Int) -> [[Element]] {
        return stride(from: 0, to: self.count, by: chunkSize).map {
            Array(self[$0..<Swift.min($0 + chunkSize, self.count)])
        }
    }
}

或者稍微详细一点,但更笼统:

let numbers = ["1","2","3","4","5","6","7"]
let chunkSize = 2
let chunks: [[String]] = stride(from: 0, to: numbers.count, by: chunkSize).map {
    let end = numbers.endIndex
    let chunkEnd = numbers.index($0, offsetBy: chunkSize, limitedBy: end) ?? end
    return Array(numbers[$0..<chunkEnd])
}

这更通用,因为我对集合中索引的类型做了更少的假设。在之前的实现中,我假设它们可以进行比较和添加。

请注意,在 Swift 3 中,推进索引的功能已从索引本身转移到集合中。

关于ios - Swift:将 [String] 拆分为具有给定子数组大小的 [[String]] 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56055899/

相关文章:

ios - UITapGestureRecognizer - 忽略顶部对象的点击并将其传递到其下方的对象

algorithm - 计算树中的零和路径

iphone - UIPageControl 中的问题

ios - Swift、Firebase - 将 CMSampleBufferRef 与相机的实时馈送一起使用

ios - 在 IOS 9 中合并音频文件时 AVAssetExportSessionStatusFailed

swift - SCNReferenceNode 中没有可用的 SCNGeometry?

ios - 在编辑模式下仍可选择单元格

c++ - 从给定位置开始的简单链表中删除元素

algorithm - 2s补码一般形式

ios - Alamofire 请求完成后如何在后台线程中解析 JSON?