Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 基于日期合并字典数组_Arrays_Swift_Dictionary - Fatal编程技术网

Arrays 基于日期合并字典数组

Arrays 基于日期合并字典数组,arrays,swift,dictionary,Arrays,Swift,Dictionary,我有两个数组,都是[[String:Any]],其中每个元素: ["date":Date,"value":CGFloat] //always looks like this 我甚至可能有超过2个(!) 我想创建一个具有相同结构的数组,对所有数组中出现的每个日期对所有数组(2个或更多)求和 如果数组1的日期没有出现在其他数组(数组2等)上,我只需在数组1的值上为该特定日期添加0 有没有一种简单有效的方法可以做到这一点?与其使用字典,不如使用结构,它更方便: struct MyStruct {

我有两个数组,都是
[[String:Any]]
,其中每个元素:

["date":Date,"value":CGFloat] //always looks like this
我甚至可能有超过2个(!)

我想创建一个具有相同结构的数组,对所有数组中出现的每个日期对所有数组(2个或更多)求和

如果数组1的日期没有出现在其他数组(数组2等)上,我只需在数组1的值上为该特定日期添加0


有没有一种简单有效的方法可以做到这一点?

与其使用字典,不如使用结构,它更方便:

struct MyStruct {
    let date: Date
    let value: CGFloat
}
让我们创建3个
MyStruct
s数组:

let now = Date()
let later = now.addingTimeInterval(3600)
let earlier = now.addingTimeInterval(-3600)

let array1: [MyStruct] = [MyStruct(date: now, value: 1),
                          MyStruct(date: later, value: 2)]
let array2: [MyStruct] = [MyStruct(date: now, value: 3),
                          MyStruct(date: later, value: 4)]
let array3: [MyStruct] = [ MyStruct(date: earlier, value: 5),
                           MyStruct(date: later, value: 6)]
现在,让我们对元素进行分组,并为具有相同
date
属性的元素添加
s:

let allArrays = array1 + array2 + array3
let dict = Dictionary(allArrays.map { ($0.date, $0.value) },
                      uniquingKeysWith: { $0 + $1 })
您现在所要做的就是将其转换回一个数组
MyStruct

let newArray = dict.map { MyStruct(date: $0.key, value: $0.value) }
您可以这样检查结果:

for element in newArray {
    print("date =", element.date, "value =", element.value)
}

我找到了一种方法,假设数据在一个结构(而不是dic)中,这是一种更好的做法

我将把所有数组放在一个大数组中,按日期排序,循环,只要日期等于上一个日期(或接近相等),我将把值相加。当下一个日期不同时,我将保存日期和金额

       //create a combined array from all given arrays
        var combined = [RootData]()
        for list in dataSets {combined.append(contentsOf: list)}

        //sort it by dates
        let sortedArray =   combined.sorted {  $0.date < $1.date }

        //new array - sum of all
        var sumData = [RootData]()

        var last:Date = sortedArray[0].date //set starting point
        var sum:CGFloat = 0
        for element in sortedArray
        {
            //same date - accumulate(same is less than 1 sec difference)
            if(abs(element.date.seconds(from: last)) <= 1) {
                sum+=element.value
            }
            //save
            else {
                sumData.append(RootData(value:sum,date:last))
                sum=element.value
            }
            last=element.date
        }
   //last object
    sumData.append(RootData(value:sum,date:last))

    return  averageData
一切正常。
因为日期并不总是完全相等的,我通过假设1秒或更短的时间是相同的日期来检查相等性。

你能举个例子吗?你到处都在说数组,但我能看到的只是两个字典。[[String:Any]]不是一个字典,它是一个DIC数组…好的,请用一个例子向我们展示你的用例。当你说“多于2”时,你是指字典中的两个键还是数组中的两个元素?我是指更多的数组,比如说按日期对6个数组求和:)
value:CGFloat
date:Date