我有四个数组,它们充满了NSNull元素:年(100个元素),月(12),天(31)和arrayString。当我选择两个日期时,我想在每个日期内包含的每个数组“arrayString”中放入一个字符串。
我选择了两个约会,我做dateFormatter,我得到了第一天和最后一天,一年一个月: 我不写date1和date2,但它们是两个NSDate
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];
int firstDay = [[dateFormatter stringFromDate:data1] intValue];
int lastDay = [[dateFormatter stringFromDate:data2] intValue];
[dateFormatter setDateFormat:@"MM"];
int firstMonth = [[dateFormatter stringFromDate:data1] intValue];
int lastMonth = [[dateFormatter stringFromDate:data2] intValue];
[dateFormatter setDateFormat:@"yyyy"];
int firstYear = [[dateFormatter stringFromDate:data1] intValue]-2011;
int lastYear = [[dateFormatter stringFromDate:data2] intValue]-2011;
NSString *string = @"firstString";
在我希望在句点的每一天中包含的每个数组中添加一个NSString之后,这是可能的,因为数组中的每个位置都有我放在viewdidload中的NSNull元素:
for (int k = firstYear ; k<lastYear + 1; k++){
for (int i = firstMonth; i < lastMonth+1; i++)
{
for (int j = firstDay; j < lastDay+1; j++)
{
[[days objectAtIndex:j] addObject: string];
}
[months replaceObjectAtIndex:i withObject:days];
}
[years replaceObjectAtIndex:k withObject:months];
}
当我在同一个月选择一个句点时,此代码可以正常工作,因为如果我选择例如:15/05/2011到25/05/2011它没关系,它会在句点的每一天内填充数组字符串。 但是,如果我选择例如28/05/2011到1/06/2011,则第三个循环中存在问题;因为“firstday”是28,“lastday”是1,并且它不进入循环内部;我该如何解决这个问题?
答案 0 :(得分:0)
鉴于您对该问题的评论,我假设您正在寻找一种将字符串(或任何对象,真的)与给定日期相关联的方法。此关联适用于NSDictionary
,日期显然最好用NSDate
个实例表示。考虑到这一点,我提出了不同的数据结构。
您应该考虑以下内容,而不是深层嵌套的数组,其中NSDate
个对象是字典的键,它们各自的值是NSArray
个实例,其中包含特定时间点的字符串,不只是一天:
NSDictionary {
NSDate: NSString,
NSDate: NSString,
NSDate: ...,
}
现在您已将数据存储在合适的结构中,您希望能够查询与给定日期相关联的对象。为此,您可以使用以下方法:
- (BOOL)date:(NSDate *)date isSameDayAsReferenceDate:(NSDate *)reference {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit units = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
NSDateComponents *compDate = [calendar components:units fromDate:date];
NSDateComponents *compReference = [calendar components:units fromDate:reference];
return [compDate isEqual:compReference];
}
- (NSArray *)stringsForDay:(NSDate *)day withDictionary:(NSDictionary *)dictionary {
NSSet *dates = [dictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {
return [self date:key isSameDayAsReferenceDate:day];
}];
return [dictionary objectsForKeys:[dates allObjects] notFoundMarker:[NSNull null]];
}
现在,如果你想要今天所有字符串的数组,你可以简单地调用[self stringsForDay:[NSDate date] withDictionary:theDictionary]
并完成它。
这种方法比问题中建议的方法更灵活,因为将粒度更改为数周,数月,年等等现在非常简单。