【问题标题】:IOS: problem with triple loopIOS:三重循环问题
【发布时间】:2011-05-17 08:15:37
【问题描述】:

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

【问题讨论】:

  • 目前还不是很清楚你到底想做什么。也许您可以告诉我们您的目标(在更高的层次上),我们可以从那里帮助您?
  • 看起来很清楚,但问题是当我选择一个贯穿大多数月份的时期时
  • 我让你解释你的目标的原因是为了让我们可以帮助你用NSDateNSDateComponentsNSTimeInterval等来重新表述你的解决方案。现在是'不清楚你想要达到的目标。
  • 好的,所以我想要一张可以知道特定日期有多少元素的地图;这些是四个数组,一个在其他数组中:一个用于年,一个用于月,一个用于天,一个在天数组的每个索引中,我可以在其中添加一个字符串;这样我就有了所有日子的完整地图,我可以知道特定日子有多少信息......你明白吗?如果不清楚,我会随时为您提供进一步澄清

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


【解决方案1】:

鉴于您的问题,我假设您正在寻找一种将字符串(或任何对象,实际上)与给定日期相关联的方法。这个关联适用于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] 并完成它。

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

【讨论】:

  • 如果我想存储一个字符串,例如从 20/05/2011 到 5/6/2011?
  • “存储从 20/05/2011 到 5/6/2011 的字符串”是什么意思?您希望该字符串与这些日期之间的每一天相关联,还是您希望该字符串与该 范围 相关联?
  • 我希望该字符串与这些日期之间的每一天相关联
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2015-09-21
相关资源
最近更新 更多