将数组划分为不同大小的块

时间:2017-09-11 16:59:01

标签: arrays swift chunks stride

我从HTML Scraping获得了一系列类似于此的数据:

var resultArray = ["Maths", 2, 7, 8, "Grammar", 1, "Science", 7, 8]

我想要做的是在找到“字符串”值时将其除去。 结果应如下所示:

var new_arr1 = ["Maths", 2, 7, 8]
var new_arr2 = ["Grammar", 1]
var new_arr2 = ["Science", 7, 8]

问题在于,如果我使用这样的东西:

func chunk(_ chunkSize: Int) -> [[Element]] {
    return stride(from: 0, to: self.count, by: chunkSize).map({ (startIndex) -> [Element] in
        let endIndex = (startIndex.advanced(by: chunkSize) > self.count) ? self.count-startIndex : chunkSize
        return Array(self[startIndex..<startIndex.advanced(by: endIndex)])
    })
}

我只能有一个固定的“newArray”大小。

使用Xcode8和Swift3。提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为你的整个规范很愚蠢。你建议,你当然不能得到一系列变量。并最终得到另一个混合的字符串和数字阵列完全适得其反。您应该重新考虑您的目标(如果可能,您应该重写您的抓取代码,以便最终不会以混合数组结束。)

无论如何,根据输入,这里是如何最终得到一个元组数组:

let resultArray : [Any] = ["Maths", 2, 7, 8, "Grammar", 1, "Science", 7, 8]
let nums = resultArray.split{$0 is String}
let strings = resultArray.filter{$0 is String}
let result = Array(zip(strings, nums)).map{($0, Array($1))}
print(result) // [("Maths", [2, 7, 8]), ("Grammar", [1]), ("Science", [7, 8])]