IOS:三重循环问题

时间:2011-05-17 08:15:38

标签: objective-c xcode ios for-loop nsarray

我有四个数组,它们充满了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,并且它不进入循环内部;我该如何解决这个问题?

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]并完成它。

这种方法比问题中建议的方法更灵活,因为将粒度更改为数周,数月,年等等现在非常简单。