Сортировать массив по пользовательскому правилу - PullRequest
0 голосов
/ 17 января 2020

Я хочу отсортировать свой массив по времени, но вместо того, чтобы с 0000h до 2359h, я хочу, чтобы он сортировался с 0600h и заканчивался в 0559h. Строка кода ниже сортирует мой массив аварийных сигналов по значению даты (тип даты), но, очевидно, начиная с 0000h. Есть ли простой способ сортировки по определенной точке или мне нужно разделить массив на две части (одну с 6 утра до полуночи и одну с полуночи до 5:59 утра)?

array.sort { $0.time.date.compare($1.time.date) == .orderedAscending }

1 Ответ

1 голос
/ 17 января 2020

Сначала добавьте Date, чтобы было легче извлечь из него часовые и минутные компоненты.

extension Date {
    var hour: Int { Calendar.current.component(.hour, from: self) }
    var minute: Int { Calendar.current.component(.minute, from: self) }
}

Затем вы можете создать собственную сортировку, как показано в этом сообщении :

array.sort {  
    if $0.time.date.hour < 6, $1.time.date.hour >= 6 { return false }
    if $1.time.date.hour < 6, $0.time.date.hour >= 6 { return true  }
    return ($0.time.date.hour, $0.time.date.minute) < ($1.time.date.hour, $1.time.date.minute)
}

Тестирование игровой площадки:

let date1 = DateComponents(calendar: .current, year: 2016, month: 12, day: 10, hour: 23, minute: 0).date!
let date2 = DateComponents(calendar: .current, year: 2017, month: 11, day: 5, hour: 3, minute: 0).date!
let date3 = DateComponents(calendar: .current, year: 2018, month: 8, day: 6, hour: 6, minute: 0).date!
let date4 = DateComponents(calendar: .current, year: 2019, month: 9, day: 27, hour: 7, minute: 0).date!
let date5 = DateComponents(calendar: .current, year: 2020, month: 10, day: 30, hour: 2, minute: 0).date!

var dates = [date1,date2,date3,date4,date5]

dates.sort {
    if $0.hour < 6, $1.hour >= 6 { return false }
    if $1.hour < 6, $0.hour >= 6 { return true  }
    return ($0.hour,$0.minute) < ($1.hour,$1.minute)
}
dates  // "Aug 6, 2018 at 6:00 AM", "Sep 27, 2019 at 7:00 AM", "Dec 10, 2016 at 11:00 PM", "Oct 30, 2020 at 2:00 AM", "Nov 5, 2017 at 3:00 AM"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...