加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Swift中将数组拆分为子数组

发布时间:2020-12-14 05:31:44 所属栏目:百科 来源:网络整理
导读:问题 给定一个值数组,如何将其拆分为由相等元素组成的子数组? 例 鉴于此数组 let numbers = [1,1,3,4] 我想要这个输出 [[1,1],[3,3],[4]] 我不想要的 解决这个问题的一种可能方法是创建某种索引来指示每个元素的出现. let indexes = [1:3,3:2,4:1] 最后使用
问题

给定一个值数组,如何将其拆分为由相等元素组成的子数组?

鉴于此数组

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读