IOS: проблема с тройным циклом - PullRequest
0 голосов
/ 17 мая 2011

У меня есть четыре массива, и они полны элементов 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 внутри каждого массива, содержащегося в каждом дне периода, это возможно, потому что в каждой позиции в массивах есть элементы NSNull, которые я помещаю внутрь в viewdidload:

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 мая 2011 года по 1 июня 2011 года, возникнет проблема в третьем цикле; потому что «firstday» равен 28, а «lastday» равен 1, и он не входит внутрь цикла; как я могу решить эту проблему?

1 Ответ

0 голосов
/ 17 мая 2011

Учитывая ваши комментарии к вопросу, я предполагаю, что вы ищете способ связать строки (или любой объект, действительно) с заданными днями. Эта ассоциация поддается 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] и покончить с этим.

Этот подход является более гибким, чем предлагаемая вами альтернатива, предложенная в этом вопросе, поскольку изменение степени детализации на недели, месяцы, годы и т. Д. Теперь очень просто.

...