2014-02-13 3 views
0

У меня есть набор элементов класса Time. Time содержит 3 объекта: weekDay (от 1 до 7, с воскресенья по субботу), openHour (00h00 до 23h59) и closeHour (00h00 до 23h59).Групповые дни в зависимости от времени работы

Я хочу, учитывая массив как это:

[{1, "10h00", "17h00"}, 
{2, "08h00", "18h00"}, 
{3, "08h00", "18h00"}, 
{4, "08h00", "18h00"}, 
{5, "08h00", "18h00"}, 
{6, "09h00", "17h00"}, 
{7, "09h00", "17h00"}] 

написать список дней и часов, как это:

Вс: 10:00 - 17:00
пн - чт: 08.00 - 18-00
Пт - Сб: 09.00 - 17h00

я могу легко написать одну строку в день, но я не знаю, как группировать дней, которые имеют один и тот же период (равные открытые и закрытые часы). Как я могу правильно создать эти диапазоны?

Любой псевдокод мне поможет, но это будет реализовано в Objective-C. Если кто-то знает библиотеку или что-то, что облегчает задачу Objective-C, это тоже поможет.

ответ

1

Нечто подобное может работать. Я был слишком ленив, чтобы создавать классы, но он должен дать вам представление о том, как подойти к проблеме.

Общая идея состоит в том, чтобы проходить через все дни, получать значения за каждый день, сравнивать их с предыдущим днем ​​и проверять, являются ли часы работы одинаковыми.

Чтобы улучшить это, если у вас есть isEqualToTime: метод на ваших классах, чтобы сравнить его с предыдущим временем. И, конечно, если вы хотите сгруппировать его, измените вывод NSLog, чтобы сохранить информацию о группе в NSDictionary или что угодно.

NSArray* rangeStartElement = nil; 
NSArray* rangeStopElement = nil; 

for (int day = 0; day < 7; day++) 
{ 
    NSArray* valuesForCurrentDay = [openConfig objectAtIndex:day]; 
    NSString* currentFrom = [valuesForCurrentDay objectAtIndex:1]; 
    NSString* currentTo = [valuesForCurrentDay objectAtIndex:2]; 

    if(rangeStartElement == nil) 
    { 
     rangeStartElement = valuesForCurrentDay; 
    } 
    else 
    { 
     NSString* previousFrom = [rangeStartElement objectAtIndex:1]; 
     NSString* previousTo = [rangeStartElement objectAtIndex:2]; 

     BOOL isSameAsPrevious = [currentFrom isEqualToString:previousFrom] && [currentTo isEqualToString:previousTo]; 
     if(isSameAsPrevious) 
     { 
      rangeStopElement = valuesForCurrentDay; 
     } 

     if(isSameAsPrevious == NO || day == 6) 
     { 
      if(rangeStopElement) 
      { 
       NSLog(@"Day %@ - Day %@: %@ - %@", 
         [rangeStartElement objectAtIndex:0], 
         [rangeStopElement objectAtIndex:0], 
         [rangeStartElement objectAtIndex:1], 
         [rangeStartElement objectAtIndex:2]); 
      } 
      else 
      { 
       NSLog(@"Day %@: %@ - %@", 
         [rangeStartElement objectAtIndex:0], 
         [rangeStartElement objectAtIndex:1], 
         [rangeStartElement objectAtIndex:2]); 
      } 

      rangeStartElement = valuesForCurrentDay; 
     } 
    } 
} 

EDIT:

Из того, что вы сказали, что если вы действительно хотите иметь пользовательские сортировки, я бы предложил создать вспомогательный класс вроде этого:

@interface OpeningGroup 
@property (nonatomic, retain) NSString* from; 
@property (nonatomic, retain) NSString* to; 
@property (nonatomic, retain) NSString* days; 
- (BOOL) addTimeObject:(Time*) timeObject; 
@end 

Чем вы держите массив эти объекты и попытаться добавить их в группу, если «от» и «до» одинаковы. return YES/NO, если это удалось. Если ни одна группа не была найдена, создайте новую. Чем вы держите дни в каждой группе. Позже вам просто нужно выяснить, как отображать результаты, но должно быть легко.

+0

Это очень хорошее начало, но в этом случае вы предполагаете, что массив 'openConfig' отсортирован, что я не могу гарантировать (я мог бы его отсортировать, конечно), но самое главное, он не может обрабатывать ситуации (Mon, Wed, Fri) имеют одинаковые часы работы, и (Tue, Thu) отличаются. Они не собирались. По-моему, я не уточнил в своем вопросе, но я могу взять это отсюда. Будет отмечен как правильный, если не появится лучший ответ. – Guilherme

+0

Хм я вижу. Из вопроса я думал, что вы хотите группировать только дни, которые близки друг к другу. Если вы хотите сгруппировать их по-своему, лучше всего иметь NSDictionary для их группировки. –

+0

Сортировка будет простой, если это единственная проблема. Использовать NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @ "object.property" по возрастанию: YES]; –

Смежные вопросы