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"]]
*/