Swift从数组中获取x个元素

Kur*_*ane 3 arrays xcode swift

我很感激那些知道他们在做什么的人的帮助,而不是我在 Swift 中使用 Xcode 数组。

我有从 Apple Watch 获得的超过 40 个心率读数的数组,我想制作一个只有 40 个的新数组以显示在图表上,但它们必须按顺序排列,我不希望它们乱序,所以我不能使用随机或随机播放来获得双打的前 40 个或最后 40 个。

e.g. heartratereadings = [56.0, 57.0, 58.0 ... 101.0]
var fortyReadings = ??heartratereading.somthing to get 40 values in the order they were in? 
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以做到这一点?提前致谢~库尔特


感谢您提供下面的解决方案,我能够在手表上绘制一个可爱的图表,通过使用 200 像素高的线的 40 个实例显示随时间变化的心率读数。然后我使用个人心率来设置 40 个小节中每个小节的高度。看起来很棒,显然不是用于任何科学或医学目的,只是让我大致了解心率如何随时间变化。Apples 模拟器只能提供 58-62 的心率读数,所以我等不及要测试了。谢谢!!

截屏

Mar*_*n R 5

这类似于@staticVoidMan 建议的内容。代替递归,新(较小)数组的索引通过线性插值映射到旧(较大)数组的索引:

extension Array  {

    /// Return a smaller array by picking “evenly distributed” elements.
    ///
    /// - Parameter length: The desired array length
    /// - Returns: An array with `length` elements from `self`

    func pick(length: Int) -> [Element]  {
        precondition(length >= 0, "length must not be negative")
        if length >= count { return self }
        let oldMax = Double(count - 1)
        let newMax = Double(length - 1)
        return (0..<length).map { self[Int((Double($0) * oldMax / newMax).rounded())] }
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let doubleArray = [56.0, 57.0, 58.0, 98.0, 101.0, 88.0, 76.0]
print(doubleArray.pick(length: 5))
// [56.0, 58.0, 98.0, 88.0, 76.0]

let intArray = Array(1...10)
print(intArray.pick(length: 8))
// [1, 2, 4, 5, 6, 7, 9, 10]
Run Code Online (Sandbox Code Playgroud)