Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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
Ios 更复杂的数组字典_Ios_Iphone_Swift_Xcode - Fatal编程技术网

Ios 更复杂的数组字典

Ios 更复杂的数组字典,ios,iphone,swift,xcode,Ios,Iphone,Swift,Xcode,我试图计算一个人在一天中喝一杯水的次数(以一小时为间隔),我不知道如何正确构建此数据结构,预期数据如下所示: day1 = [hour interval: [time, time, time], hour interval: [time], hour interval: [time], hour:[time]] 它打印一个空数组…到目前为止,我有: var counts = [String:Array<NSDate>]() var dict = [[NSDate:Array<

我试图计算一个人在一天中喝一杯水的次数(以一小时为间隔),我不知道如何正确构建此数据结构,预期数据如下所示:

day1 = [hour interval: [time, time, time], hour interval: [time], hour interval: [time], hour:[time]]
它打印一个空数组…到目前为止,我有:

var counts = [String:Array<NSDate>]()
var dict = [[NSDate:Array<[String:Array<NSDate>]>]]()

//datesArray -> is an array of dates from something like monday to friday
/*
datesArray:

2016-07-23
2016-07-24
2016-07-25
2016-07-26
2016-07-27
2016-07-28
2016-07-29
2016-07-30
*/


    for date in datesArray {

           //tempDoses has the times when the user took the glass of water 
/*
tempDoses:

2016-07-28 23:50:50 +0000
2016-07-26 13:06:57 +0000
2016-07-25 08:47:52 +0000
2016-07-25 08:46:47 +0000
2016-07-25 08:46:06 +0000
2016-07-24 23:25:07 +0000
2016-07-24 14:18:11 +0000
2016-07-24 13:58:35 +0000
2016-07-22 09:10:59 +0000
2016-07-22 09:10:26 +0000
2016-07-22 09:09:28 +0000
*/


              for temp in tempDoses {

                    if calendar.isDate(date, inSameDayAsDate: temp.logTime)



                        let dateformatter = NSDateFormatter()

                        dateformatter.dateFormat = "HH:mm"

                        let myDate = dateformatter.stringFromDate(temp.logTime)



                        let h = self.getHour(myDate)

                        for m in counts {
                         var o = m

                            if o.0 == h {
                                o.1.append(temp.logTime)
                            }
                        }
                    }
                }

                if counts.count > 0 {
                    dict.append([date:[counts]])
                    counts.removeAll()
                }else{
                    dict.append([date:[]])
                }
            }

您的预期输出与您的输入不匹配!例如,在
2016-07-22
上:

// Input
2016-07-22 09:10:59 +0000
2016-07-22 09:10:26 +0000
2016-07-22 09:09:28 +0000

// My expected output
2016-07-22 = [9: ["09:10", "09:09"]]

// Your expected output:
2016-07-22 = ["10": [09:10, 09:13]]
玩下面的代码,直到你得到你想要的在处理
NSDate
时,请特别注意时区,因为它是错误的主要来源:

let timeZone = NSTimeZone(forSecondsFromGMT: 0)

let calendar = NSCalendar.currentCalendar()
calendar.timeZone = timeZone

let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
formatter.timeZone = timeZone

var dict = [NSDate : [Int: [String]]]()

for date in datesArray {
    let dailyDoses = doses
                        .filter { calendar.startOfDayForDate($0.logTime) == date }
                        .sort { $0.logTime.timeIntervalSince1970 < $1.logTime.timeIntervalSince1970 }

    dict[date] = [Int: [String]]()

    dailyDoses.forEach {
        let hour = calendar.component(.Hour, fromDate: $0.logTime)
        let str = formatter.stringFromDate($0.logTime)

        if dict[date]![hour] == nil {
            dict[date]![hour] = [String]()
        }
        if !(dict[date]![hour]!.contains { $0 == str }) {
            dict[date]![hour]!.append(str)
        }
    }
}

// Print the result
for date in datesArray {
    print(date, "=", dict[date]!)
}

/* Output:
2016-07-22 00:00:00 +0000 = [9: ["09:09", "09:10"]]
2016-07-23 00:00:00 +0000 = [:]
2016-07-24 00:00:00 +0000 = [14: ["14:18"], 23: ["23:25"], 13: ["13:58"]]
2016-07-25 00:00:00 +0000 = [8: ["08:46", "08:47"]]
2016-07-26 00:00:00 +0000 = [13: ["13:06"]]
2016-07-27 00:00:00 +0000 = [:]
2016-07-28 00:00:00 +0000 = [23: ["23:50"]]
*/
let timeZone=NSTimeZone(forSecondsFromGMT:0)
让calendar=NSCalendar.currentCalendar()
calendar.timeZone=时区
let formatter=NSDateFormatter()
formatter.dateFormat=“HH:mm”
formatter.timeZone=时区
变量dict=[NSDate:[Int:[String]]]()
datesArray中的日期{
让每日剂量=剂量
.filter{calendar.startOfDayForDate($0.logTime)==date}
.sort{$0.logTime.timeIntervalSince1970<$1.logTime.timeIntervalSince1970}
dict[date]=[Int:[String]]()
每日剂量{
设hour=calendar.component(.hour,fromDate:$0.logTime)
让str=formatter.stringFromDate($0.logTime)
如果dict[日期]![小时]==零{
dict[date]![hour]=[String]()
}
if!(dict[date]![hour]!.包含{$0==str}){
dict[日期]![小时]!.追加(str)
}
}
}
//打印结果
datesArray中的日期{
打印(日期,“=”,记录[日期]!)
}
/*输出:
2016-07-22 00:00:00 +0000 = [9: ["09:09", "09:10"]]
2016-07-23 00:00:00 +0000 = [:]
2016-07-24 00:00:00 +0000 = [14: ["14:18"], 23: ["23:25"], 13: ["13:58"]]
2016-07-25 00:00:00 +0000 = [8: ["08:46", "08:47"]]
2016-07-26 00:00:00 +0000 = [13: ["13:06"]]
2016-07-27 00:00:00 +0000 = [:]
2016-07-28 00:00:00 +0000 = [23: ["23:50"]]
*/

为了省去弄清楚你的源代码是什么样的麻烦,你能编辑你的问题以包含预期的输入和输出吗?好的,很抱歉造成混淆我也做了一些评论,我仍然看不到你的输入是什么。您的
日期的价值是多少?回答得很好,感谢日期格式上的警告:)
let timeZone = NSTimeZone(forSecondsFromGMT: 0)

let calendar = NSCalendar.currentCalendar()
calendar.timeZone = timeZone

let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
formatter.timeZone = timeZone

var dict = [NSDate : [Int: [String]]]()

for date in datesArray {
    let dailyDoses = doses
                        .filter { calendar.startOfDayForDate($0.logTime) == date }
                        .sort { $0.logTime.timeIntervalSince1970 < $1.logTime.timeIntervalSince1970 }

    dict[date] = [Int: [String]]()

    dailyDoses.forEach {
        let hour = calendar.component(.Hour, fromDate: $0.logTime)
        let str = formatter.stringFromDate($0.logTime)

        if dict[date]![hour] == nil {
            dict[date]![hour] = [String]()
        }
        if !(dict[date]![hour]!.contains { $0 == str }) {
            dict[date]![hour]!.append(str)
        }
    }
}

// Print the result
for date in datesArray {
    print(date, "=", dict[date]!)
}

/* Output:
2016-07-22 00:00:00 +0000 = [9: ["09:09", "09:10"]]
2016-07-23 00:00:00 +0000 = [:]
2016-07-24 00:00:00 +0000 = [14: ["14:18"], 23: ["23:25"], 13: ["13:58"]]
2016-07-25 00:00:00 +0000 = [8: ["08:46", "08:47"]]
2016-07-26 00:00:00 +0000 = [13: ["13:06"]]
2016-07-27 00:00:00 +0000 = [:]
2016-07-28 00:00:00 +0000 = [23: ["23:50"]]
*/