【发布时间】:2016-07-22 17:24:49
【问题描述】:
问题
给定一个值数组,我如何将其拆分为由相等元素组成的sub-arrays?
示例
给定这个数组
let numbers = [1, 1, 1, 3, 3, 4]
我想要这个输出
[[1,1,1], [3, 3], [4]]
我不想要的东西
解决这个问题的一种可能方法是创建某种索引来指示每个元素的出现次数。
let indexes = [1:3, 3:2, 4:1]
最后使用索引重建输出数组。
let subsequences = indexes.sort { $0.0.0 < $0.1.0 }.reduce([Int]()) { (res, elm) -> [Int] in
return res + [Int](count: elm.1, repeatedValue: elm.0)
}
但是,使用此解决方案,我会失去原始值。当然在这种情况下这不是一个大问题(Int 值仍然存在,Int即使重新创建)但我想将此解决方案应用于像这样的更复杂的数据结构
struct Starship: Equatable {
let name: String
let warpSpeed: Int
}
func ==(left:Starship, right:Starship) -> Bool {
return left.warpSpeed == right.warpSpeed
}
最后的考虑
我正在寻找的功能实际上是 flatten() 的某种反转
let subsequences: [[Int]] = [[1,1,1], [3, 3], [4]]
print(Array(subsequences.flatten())) // [1, 1, 1, 3, 3, 4]
我希望我说清楚了,如果您需要更多详细信息,请告诉我。
【问题讨论】: