问题
给定一个值数组,如何将其拆分为由相等元素组成的子数组?
例
鉴于此数组
let numbers = [1,1,3,4]
我想要这个输出
[[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值仍然是Inteven,如果重新创建)但我想将此解决方案应用于更复杂的数据结构,如此
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,[4]] print(Array(subsequences.flatten())) // [1,4]
我希望自己明确表示,如果您需要进一步的细节,请告诉我.
// extract unique numbers using a set,then // map sub-arrays of the original arrays with a filter on each distinct number let numbers = [1,4] let numberGroups = Set(numbers).map{ value in return numbers.filter{$0==value} } print(numberGroups)
[编辑]改为使用Hamish建议的Set Initializer
[EDIT2] Swift 4为Dictionary添加了一个初始化程序,可以更有效地执行此操作:
let numberGroups = Array(Dictionary(grouping:numbers){$0}.values)