问题
给定一个值数组,如何将其分成由相等元素组成的子数组
?
示例
给定以下数组:
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]
我希望我的表达清晰明了,如需更多细节,请告知。
reduce
来创建Set
?你可以直接使用Set
初始化器:Set(numbers).map...
- Hamish