gpt4 book ai didi

swift - Swift 中数组值的函数聚类

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:36 24 4
gpt4 key购买 nike

给定一个数组,例如:

[0, 0.5, 0.51, 1.0, 1.5, 1.99, 2.0, 2.1, 2.5, 3.0] 

我想根据值的顺序差异(例如 abs(x-y) < nn = 0.2 )将值聚类到子数组中,例如:

[[0], [0.5, 0.51], [1.0], [1.5], [1.99, 2.0, 2.1], [2.5], [3.0]]. 

我想以声明的方式进行——只是为了更好地了解更复杂的序列操作在函数式上下文中如何工作(似乎大多数“函数式 Swift”演示/教程都非常基础)。

提前致谢。


更新:

这是一个有点接近的单行:

let times = [0, 0.5, 0.99, 1, 1.01, 1.5, 2, 2.5, 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.0, 1.01], [0.99, 1.0, 1.01], [0.99, 1.0, 1.01], [1.5], [2.0], [2.5, 2.51], [2.5, 2.51], [3.0], [3.49, 3.5], [3.49, 3.5]]

只需要去掉重复项。

最佳答案

一个带有累积参数的简单折叠就可以了。顺便说一句,不确定这是否正是您想要的,因为我不明白数组中的元素是否需要后续。在描述中你是这么说的,但是你的“示例答案”不会考虑它们是否是后续的。你应该改进问题描述。

let a : [Double] = [0, 0.5, 0.51, 1.0, 1.5, 1.99, 2.0, 2.1, 2.5, 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], [0.5, 0.51], [1.0], [1.5], [1.99, 2.0, 2.1], [2.5], [3.0]]

关于swift - Swift 中数组值的函数聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com