gpt4 book ai didi

ios - 如何过滤时间戳数组以保持特定时间?

转载 作者:搜寻专家 更新时间:2023-11-01 06:25:52 25 4
gpt4 key购买 nike

想象一下这个时间戳数组[Double]:

hourlyTimes": [1551344400, 1551348000, 1551351600, 1551355200, 1551358800, 1551362400, 1551366000, 1551369600, 1551373200 ... ]

它对应于我要显示数据的时间。

为简单起见,这里是我仅显示小时 (UTC) 时的完整数组:

Hours = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 3, 6, 9, 12, 15, 18, 21, 0, 3, 6, 9, 12, 15, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0]

现在这就是我想要实现的,我需要过滤这个时间戳数组,以便只保留任何一天(每三小时)的这些特定时间。

[0, 3, 6, 9, 12, 15, 18, 21]

好的,现在让我们看一下代码:

let arrayOfTimestamp = time.hourlyTimes
let arrayOfHours = arrayOfTimestamp.map({ Date.init(timeIntervalSince1970: $0).hoursUTC})
let hoursToKeep = [0, 3, 6, 9, 12, 15, 18, 21]
let filtered = arrayOfHours.intersection(with: hoursToKeep)

这里有一些解释:

第一行的

time 是后端的响应,向我返回所有可用的时间戳。

struct MultiForecastTimeModel: Codable {
let hourlyTimes: [Double]
let dailyTimes: [Double]
}

.hoursUTC 只是一个 Date 扩展,用于检索 Date 对象的小时部分。

var hoursUTC: Int {
var calendar = Calendar.current
let timezone = TimeZone(abbreviation: "UTC")!
calendar.timeZone = timezone
return calendar.component(.hour, from: self)
}

最后,.intersection 也是一个扩展,目的是实现与经典 intersection 相同的功能,同时保留索引和出现次数。

extension Collection where Element: Equatable {

func intersection(with filter: [Element]) -> [Element] {
return self.filter { element in filter.contains(element) }
}
}

一切正常,我唯一的问题是我现在必须将所有这些值关联为一个元组数组。

像这样:

let tuples = Array(zip(filtered, filtered.dropFirst()))

但是有一个实际的时间戳(对应于实际日期),而不仅仅是一个 Int 数组(小时分量)。

因为最后,我要做的是:

self.hourlyMapDataSource.data.value = tuples

我的数据源需要一个时间戳元组 (Double, Double)

class HourlyMapDataSource : GenericDataSource<(Double, Double)>, UICollectionViewDataSource { }

关于我应该如何改进我的代码和/或我的逻辑,您有什么建议吗?

提前谢谢你。

编辑:我的元组数组应该只包含时间已通过 hoursToKeep 数组“验证”的时间戳,因此它在小时之间有 3 小时的差异。

为了简单起见,我将向您展示时间,但这是我想要的实际对应时间戳:

[(9, 12), (12, 15), (15, 18) ...]

最佳答案

var tupleArray = hourlyTimes.map { (time: $0, hour: Date.init(timeIntervalSince1970: $0).hoursUTC)}

现在你可以运行reduce函数了

var selectedHours = tupleArray.filter { return hoursToKeep.contains($0.hour) }

这将为您提供一组具有经过验证的时间的元组,

[(1551344400, 9), (1551348000, 12)]

关于ios - 如何过滤时间戳数组以保持特定时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54923454/

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