从较大的[String]和给定的子数组大小开始,将这个数组拆分为较小的数组的最佳方法是什么?(最后一个数组将小于给定的子数组大小)。
具体示例:
以最大分割大小2分割[“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”,“ 7”] 该代码将产生[[“ 1”,“ 2”],[“ 3”,“ 4”],[“ 5”,“ 6”],[“ 7”]]
以最大分割大小2分割[“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”,“ 7”]
该代码将产生[[“ 1”,“ 2”],[“ 3”,“ 4”],[“ 5”,“ 6”],[“ 7”]]
显然,我可以手动进行一些操作,但是我觉得像map()或reduce()这样的快速操作可能确实可以实现我想要的效果。
我不会称它为美丽,但这是一种使用方法map:
map
let numbers = ["1","2","3","4","5","6","7"] let splitSize = 2 let chunks = numbers.startIndex.stride(to: numbers.count, by: splitSize).map { numbers[$0 ..< $0.advancedBy(splitSize, limit: numbers.endIndex)] }
该stride(to:by:)方法为您提供每个块的第一个元素的索引,因此您可以使用将这些索引映射到源数组的一个切片advancedBy(distance:limit:)。
stride(to:by:)
advancedBy(distance:limit:)
更具“功能性”的方法只是在数组上递归,如下所示:
func chunkArray<T>(s: [T], splitSize: Int) -> [[T]] { if countElements(s) <= splitSize { return [s] } else { return [Array<T>(s[0..<splitSize])] + chunkArray(Array<T>(s[splitSize..<s.count]), splitSize) } }