这是一个样本,其中包含我的日期数组中的少量条目:
let dates: [Date] = [
Date.new(year: 1998, month: 04, day: 13),
Date.new(year: 1998, month: 04, day: 13),
Date.new(year: 1998, month: 04, day: 13),
Date.new(year: 1998, month: 04, day: 18),
Date.new(year: 1998, month: 04, day: 18),
Date.new(year: 1998, month: 04, day: 18),
Date.new(year: 1998, month: 07, day: 09),
Date.new(year: 1998, month: 07, day: 09),
Date.new(year: 1999, month: 07, day: 29),
Date.new(year: 1999, month: 07, day: 29),
Date.new(year: 1999, month: 09, day: 17),
Date.new(year: 1999, month: 09, day: 17),
Date.new(year: 1999, month: 09, day: 25),
Date.new(year: 1999, month: 09, day: 25)
]
顺便说一下,我使用以下扩展名初始化了日期:
extension Date {
static func new(year: Int, month: Int, day: Int) -> Date {
return Calendar(identifier: .gregorian).date(from: DateComponents(year: year, month: month, day: day))!
}
}
请注意,所有内容均应由代码处理,因为此数组由用户填充,而且我通常不知道其中的日期或任何年份。
我正在尝试创建日期的排序数组,以使同一天中的所有日期都得到一个数组,然后将同一月中的所有数组分组在一起,然后将同一年的所有数组都分组分组在一起,然后将所有年份数组都分组为一个大数组。
我可以举一个例子:
[
[ [[13/2/1998 @ t1, 13/2/1998 @ t5], [25/2/1998 @ t565]], [[13/6/1998 @ t56]]] //Array for 1998
]
无论如何,我已经创建了以下代码,并且可以正常工作。但是问题在于,它变得越来越混乱,难以理解且难以持续,而且我仍然必须按日期和“ AM / PM”对日期进行分组。
extension Array where Element == Date {
func sortedByDates() -> [[[Date]]] {
var years = [Int]()
var monthsForYear = [Int : [Int]]()
var sortedData = [[[Date]]]()
for date in self {
if !years.contains(date.year()) {
years.append(date.year())
}
}
print("years: \(years)")
for year in years {
for date in self {
if date.year() == year {
if monthsForYear[year] == nil {
monthsForYear[year] = [date.month()]
} else if !(monthsForYear[year]?.contains(date.month()))! {
monthsForYear[year]?.append(date.month())
}
}
}
}
print("months for each year: \(monthsForYear)")
for (year, monthsOfYear) in monthsForYear {
var contentForYear = [[Date]]()
for month in monthsOfYear {
var contentForMonth = [Date]()
for date in self {
if date.year() == year && date.month() == month {
contentForMonth.append(date)
}
}
contentForYear.append(contentForMonth)
}
sortedData.append(contentForYear)
}
return sortedData
}
}
答案 0 :(得分:1)
我将展示您可以将一个数组分组为一个字典,并在一行中包含子数组值。仅以此为例,您可以按照以下方法将dates
分组为各个年份:
let greg = Calendar(identifier: .gregorian)
let d = Dictionary(grouping: dates, by: {greg.dateComponents([.year], from: $0).year!})
如果愿意,您可以将该字典转换为其他形式,例如自定义结构或对的数组或其他形式。