Swift中数组值的功能聚类
发布时间:2020-12-14 04:49:09 所属栏目:百科 来源:网络整理
导读:给定一个数组,如: [0,0.5,0.51,1.0,1.5,1.99,2.0,2.1,2.5,3.0] 我想基于它们的顺序差异将值聚集到子阵列中(例如,其中abs(x-y) n,并且n = 0.2),例如: [[0],[0.5,0.51],[1.0],[1.5],[1.99,2.1],[2.5],[3.0]]. 我想以声明的方式做 – 只是为了更好地掌握更复
给定一个数组,如:
[0,0.5,0.51,1.0,1.5,1.99,2.0,2.1,2.5,3.0] 我想基于它们的顺序差异将值聚集到子阵列中(例如,其中abs(x-y)< n,并且n = 0.2),例如: [[0],[0.5,0.51],[1.0],[1.5],[1.99,2.1],[2.5],[3.0]]. 我想以声明的方式做 – 只是为了更好地掌握更复杂的序列操作如何在功能上下文中工作(似乎大多数“功能性Swift”演示/教程都非常基本). 提前致谢. 更新: 这是一个有点接近的单线: let times = [0,0.99,1,1.01,2,2.51,3,3.49,3.5] let result = times.map { t1 in return times.filter { fabs($0 - t1) < 0.2 } } // [[0.0],[0.5],[0.99,1.01],[2.0],[2.5,2.51],[3.0],[3.49,3.5],3.5]] 只需要摆脱重复. 解决方法
带累积参数的简单折叠有效.顺便说一下,不确定这是不是你想要的,因为我不明白你的数组中的元素是否需要随后.在你说明中你这么说,但是你的’样本答案’没有考虑它们是否是后续的.你应该改进问题描述.
let a : [Double] = [0,3.0]; let diff : Double = 0.2; let eps = 0.0000001 let b = a.sort().reduce(([],[])) { (ps : ([Double],[[Double]]),c : Double) -> ([Double],[[Double]]) in if ps.0.count == 0 || abs(ps.0.first! - c) - diff <= eps { return (ps.0 + [c],ps.1) } else { return ([c],ps.1 + [ps.0]) } } let result = b.1 + [b.0]; print(result) 返回 [[0.0],[3.0]] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |