@lycrois

Как правильно составить время работы из массива?

На входе есть массив объектов [Time], где
struct Time {
id: Int
from: String
to: String
}
id - 0-6 - Пон-Вскр
Нужно превести массив к виду расписания работы

Пример:
[Time(0, 09:00, 12:00), Time(1, 09:00, 12:00), Time(0,13:00,18:00), Time(1, 13:00, 18:00), Time(2, 09:00, 12:00), Time(2, 13:00, 18:00), Time(4, 09:00, 17:00)]
Результат:
Пн-Ср 09:00-12:00 13:00-18:00
Пт 09:00-17:00

Что есть сейчас (работает не всегда правильно)
private static var dayArr = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

public var openingHoursDict: [String: String] {
var tempArr = [String]()
if let arr = openingHours {
for ind in 0..<7 {
var time = ""
arr.forEach({ openingHour in
if openingHour.day == ind {
if let from = openingHour.from, let to = openingHour.to {
time += from + "-" + to + " "
}
}
})
tempArr.append(time)
}
}
var tempDict = [[Int]: String]()
for ind in 0..<7 {
let value = tempArr[ind]
var key = [Int]()
for indVal in tempArr.enumerated() where indVal.element == value {
key.append(indVal.offset)
}
key.sort()
if !value.isEmpty {
tempDict.updateValue(value, forKey: key)
}
}
var str = ""
var strDict = [String: String]()
for keyArray in tempDict.keys.enumerated() {
for ind in keyArray.element.enumerated() {
if ind.offset == 0 || ind.element != keyArray.element[ind.offset - 1] + 1 {
str += "\(PoiContact.dayArr[ind.element])-"
}
if ind.offset == keyArray.element.count - 1 {
str += PoiContact.dayArr[ind.element]
} else if keyArray.element[ind.offset + 1] != ind.element + 1 {
str += "\(PoiContact.dayArr[ind.element]), "
}
}
// str = str.replacingOccurrences(of: "/([A-Z][a-z]+)-\\1/", with: "\\1")
strDict.updateValue(tempDict[keyArray.element] ?? "", forKey: str)
}
return strDict
}
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
Loriens
@Loriens
iOS Developer
Попробуйте проще:
Сортируете массив по id, сохраняете начало одинаковых дней и проходитесь по нему по порядку. В каждой новой итерации сравниваете время. Если расписание изменилось, то выводите строку со временем и обновляете начало одинаковых дней.

Ваше решение выглядит сложно.

И мне кажется, что логичнее было бы обеденное время как отдельное поле внести. Так и работать легче, и id уникальны:
struct Time {
    var id: Int
    var from: String
    var to: String
    var dinnerBreakFrom: String
    var dinnerBreakTo: String
}

Или можно ещё сущность добавить, которая будет соединять в себе два куска Time, если не хочется что-то переписывать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы