Как отфильтровать массив меток времени, чтобы сохранить определенные часы? - PullRequest
0 голосов
/ 28 февраля 2019

Представьте себе этот массив отметок времени [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.

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) ...]

1 Ответ

0 голосов
/ 28 февраля 2019
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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...