Arrays Swift从数组中获取x个元素数

Arrays Swift从数组中获取x个元素数,arrays,swift,xcode,Arrays,Swift,Xcode,我非常感谢那些知道他们在做什么的人的帮助,而不是我在Swift for Xcode中使用数组 我有一个超过40+心率读数的数组,我从苹果手表上得到,我想制作一个新的数组,只有正好40才能显示在图表上,但它们必须有序,我不希望它们乱序,所以我不能使用随机或随机获得双打的前40个或最后40个 e.g. heartratereadings = [56.0, 57.0, 58.0 ... 101.0] var fortyReadings = ??heartratereading.somthing to

我非常感谢那些知道他们在做什么的人的帮助,而不是我在Swift for Xcode中使用数组

我有一个超过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? 
我有什么办法可以做到?提前谢谢~Kurt


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


以下是最简单的方法:

var heartRateReading = [56.0, 57.0, 58.0, 98.0, ..., 101.0]

//If you want 40 items from the 10th position
var fortySelected = heartRateReading.suffix(from: 10).suffix(40)

// If you want to iterate each second and get 40 values out of it
_ = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (_) in
  let values = heartRateReading.suffix(40)
  print(values)
}

对于初学者来说,
Array
上的这个基本扩展添加了从任何类型的数组返回备用元素的功能:

extension Array {
    
    func evenlySpaced(length: Int) -> [Element] {
        guard length < self.count else { return self }
        
        let takeIndex = (self.count / length) - 1
        let nextArray = Array(self.dropFirst(takeIndex + 1))
        return [self[takeIndex]] + nextArray.evenlySpaced(length: length - 1)
    }
    
}
[56.0,57.0,58.0,98.0,101.0,88.0,76.0]
均匀间隔将给出:
[56.0,57.0,58.0,101.0,76.0]


例2: 这表明,如果您有一个包含1000个元素的数组,则所选的间隔值为:

[25、50、75、100、125、150、175、200、225、250、275、300、325、350、375、400、425、450、475、500、525、550、575、600、625、650、675、700、725、750、775、800、825、850、875、900、925、950、975、1000]


这是一个简单的实现,您可以粗略地说它是等距的,因为它倾向于使用与请求的长度相比较小的数据集中的初始元素

例3: [1,2,3,4,5,6,8,10]

相反,您可以实现更平衡的逻辑,但总体思路是相同的。

这类似于。新(较小)数组的索引通过线性插值映射到旧(较大)数组的索引,而不是递归:

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())] }
    }
}
只需使用for循环

Var forty = [double]()
For n in 1...40 {
     forty.insert(heartRate[n], at: 0)
}

可能的重复不完全是因为我不想要前40个或最后40个。我想要从一个超过40个的数组中均匀地选择40个,而不要把它们混在一起,就像按照记录的顺序保存一样,这样我就可以制作一个图表。你没有明确的逻辑。拿出一个清晰的逻辑。@KurtLane:你应该把这些信息添加到问题本身。评论可以随时删除。
心率读数是否按采样时间排序?例如,按值对心脏脉冲频率进行排序似乎是毫无意义的数据。OP明确表示,他需要按顺序排列。不以任何方式对它们进行排序。按升序或降序排序对任何人来说都不是这种类型数据的有用案例。嗨,如果我不清楚,很抱歉。我根本不想把它们混在一起。下场或下场都不好,前四十和后四十都不是我想要的。我确实需要它们,以便在不混淆它们的情况下记录它们。如何从超过40个的阵列中仅获取40个连续读数。比如说,如果每秒有80个数字,但是如果有50个数字,那么就把它们混在一起。这正是我想要的。谢谢你的回答。在模拟器上工作得很好,现在必须在真正的手表上测试。再次感谢。@KurtLane:)很高兴为您提供帮助谢谢您的回答!有一个。太好了谢谢你的回答!有一个。好日子
let array = (1...10).map { $0 }
print(array.evenlySpaced(length: 8))
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())] }
    }
}
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]
Var forty = [double]()
For n in 1...40 {
     forty.insert(heartRate[n], at: 0)
}