将数组的内容分组为多个嵌套数组

时间:2018-07-29 23:06:10

标签: arrays swift

这是一个样本,其中包含我的日期数组中的少量条目:

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
}
}

1 个答案:

答案 0 :(得分:1)

我将展示您可以将一个数组分组为一个字典,并在一行中包含子数组值。仅以此为例,您可以按照以下方法将dates分组为各个年份:

let greg = Calendar(identifier: .gregorian)
let d = Dictionary(grouping: dates, by: {greg.dateComponents([.year], from: $0).year!})

如果愿意,您可以将该字典转换为其他形式,例如自定义结构或对的数组或其他形式。