Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift-在一个大的时间范围内按周对一系列项目进行分组_Arrays_Swift_Date_Multidimensional Array_Mapping - Fatal编程技术网

Arrays Swift-在一个大的时间范围内按周对一系列项目进行分组

Arrays Swift-在一个大的时间范围内按周对一系列项目进行分组,arrays,swift,date,multidimensional-array,mapping,Arrays,Swift,Date,Multidimensional Array,Mapping,我目前正在从事一个项目,该项目要求我操作一个包含日期和双精度值的对象数组。我能够在一本多年的字典中对其进行分解,然后将这些嵌套数组分解为当年的几个星期。不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中 我想要实现的是一个数组或字典,它包含了分组到每个星期的所有日期以及该组中所有金额的总和 我已经尝试过按.weekOfYear对它们进行分组,但这并不考虑年份本身,如果两个日期相隔一年以上,我将始终只有52个条目长的数组 我还研究了通过使用Calendar.current.ordin

我目前正在从事一个项目,该项目要求我操作一个包含日期和双精度值的对象数组。我能够在一本多年的字典中对其进行分解,然后将这些嵌套数组分解为当年的几个星期。不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中

我想要实现的是一个数组或字典,它包含了分组到每个星期的所有日期以及该组中所有金额的总和

我已经尝试过按
.weekOfYear
对它们进行分组,但这并不考虑年份本身,如果两个日期相隔一年以上,我将始终只有52个条目长的数组

我还研究了通过使用
Calendar.current.ordinality(of:.weekOfYear,in:.era,for:'date')来使用星期的顺序。
但是它被转换成一个整数,我不知道如何将它返回到一个日期

下面是我在xCode游乐场中使用的代码及其输出的副本

import Foundation

let cal = Calendar.current

extension Date {
    var year: Int {
        return cal.component(.year, from: self)
    }
    var week: Int {
        return cal.component(.weekOfYear, from: self)
    }
    var weekAndYear: DateComponents {
        return cal.dateComponents([.weekOfYear, .year], from: self)
    }
}

struct Item {
    var date: Date
    var amount: Double
}

let startDate: Date = cal.date(from: DateComponents(year: 2018, month: 12, day: 2))!
let endDate: Date = cal.date(from: DateComponents(year: 2019, month: 1, day: 28))!

// Here I'm creating dummy items for each date between our date range
func setUpItems (startDate: Date, endDate: Date) -> [Item] {
    var date = startDate
    var inputArray: [Item] = []

    let dateCount = cal.dateComponents([.day], from: startDate, to: endDate).day
    let valuePerDay: Double = 1000 / Double(dateCount!)
    let lowerLim = valuePerDay - (valuePerDay / 2)
    let upperLim = valuePerDay + (valuePerDay / 2)

    while date < endDate {
        let input = Double.random(in: lowerLim...upperLim).rounded()
        inputArray.append(Item(
            date: date,
            amount: input
        ))
        date = cal.date(byAdding: .day, value: 1, to: date)!
    }

    return inputArray
}

let itemArray = setUpItems(startDate: startDate, endDate: endDate)


let grouppedByYear = Dictionary(grouping: itemArray, by: { $0.date.year })

let grouppedByYearThenWeek = grouppedByYear
    .mapValues{(yearArray: [Item]) -> Dictionary<Int, Double> in
        return Dictionary(grouping: yearArray, by: { $0.date.week })
            .mapValues{ (value: [Item]) in
                return value.map{ $0.amount }.reduce(0, +)
        }
    }

print("Grouped by week")
print(grouppedByYearThenWeek)
我希望最终能有一本字典,不会因为年份的不同而把一周分割开来

[2018: [49: 127.0, 52: 125.0, 50: 119.0, 51: 113.0],
  2019: [3: 124.0, 4: 122.0, 5: 19.0, 1: 126.0, 2: 121.0]]

// or potentially

[["49 2018": 127.0, "52 2018": 125.0...],
  ["3 2019": 124.0, "4 2019": 122.0...]]
任何帮助都将不胜感激

不幸的是,一年中的第一周经常出现在一年中的某一年和接下来的几年中

对。但是如果您要检索一年中的一周,那么使用
.year
检索该周是没有意义的。您希望将
.yearForWeekOfYear
.weekOfYear
结合使用:

var weekAndYear: DateComponents {
    return cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: self)
}

var yearForWeekOfYear: Int {
    return cal.component(.yearForWeekOfYear, from: self)
}
您可能会发现使用“每周开始”计算属性很有用:

var startOfWeek: Date {
    let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
    return cal.date(from: components)!
}

归根结底,你想如何对待2018年12月31日。您希望它出现在2019年第1周(就像标准的
weekOfYear
yearForWeekOfYear
那样),还是希望将其归因于“2018年第53周”。简言之,您是希望将2018年12月30日开始的一周视为一周(上述内容将实现),还是希望将其拆分,将本周的开始视为2018年第53周,将本周的后半部视为2019年第1周?

因此2018年12月31日和2019年1月1日在同一周。所以我猜你希望他们在2019年第一周的同一周内出席?也许你可以澄清一下。(我可能建议删除所有这些代码,这些代码只会使问题变得模糊,并将其简化为类似这样的简单内容,即,您希望这两个日期显示在哪一周和哪一年。)
var startOfWeek: Date {
    let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
    return cal.date(from: components)!
}