У меня есть объект Stat, который имеет свойства время и счет. У меня есть список (отсортированный по времени) этих объектов, которые поступают в каждый час. Я бы хотел сгруппировать для отображения. Есть ли хороший способ скопировать данные по времени в объекте c? или более хороший алгоритм, чем наивный ниже?Данные кластеризации с датами по часам, день, неделя, месяц, год Цель c
Это пример проведения еженедельно. Другие аналогичны, но вы меняете компоненты даты.
-(void) makeWeeklyData{
Stat *prev = self.hourlyData[0];
NSInteger sum = 0;
NSMutableArray *weeklyData = [NSMutableArray array];
for (CSInstallStat *data in self.hourlyData) {
NSDateComponents *itemComps = [[NSCalendar currentCalendar] components:kCFCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:data.time];
[itemComps setCalendar:[NSCalendar currentCalendar]];
NSDateComponents *currComps = [[NSCalendar currentCalendar] components:kCFCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:prev.time];
[currComps setCalendar:[NSCalendar currentCalendar]];
if ([itemComps weekOfYear] == [currComps weekOfYear] && [itemComps month] == [currComps month] && [itemComps year] == [currComps year]) {//Same Week
sum += data.count;
} else if([itemComps weekOfYear] >= [currComps weekOfYear] && [itemComps month] == [currComps month] && [itemComps year] == [currComps year]) { //Next Week
Stat *stat = [[CSInstallStat alloc] init];
stat.time = [currComps date];
stat.count = sum;
stat.timeAccuracy = ENUMWeekly;
[weeklyData addObject:stat];
sum = 0;
sum += data.count;
prev = data;
} else {
prev = data;
}
}
self.weeklyData = weeklyData;
}
Моя библиотека [MBCalendarKit] (http://github.com/mosheberman/MBCalendarKit) содержит некоторые категории в NSCalendar и NSDate, которые могут оказаться полезными. – Moshe