[英]Objective-C Sort NSMutableArray of Objects by a specific Object attribute
[英]Objective-C: Sort NSMutableArray of NSDates by weekday
我在执行以下任务时遇到困难:我有一个NSMutableArray,其中包含从核心数据中提取的NSManagedObjects“ OpeningHours”。
NSMutableArray *openingHoursArray = [NSMutableArray arrayWithArray: [[museum valueForKey:@"openingHours"] allObjects]];
数组未排序,因为从我的NSManagedObject“博物馆”获取键的值会返回一个随机组织的集合。
数组中的NSManagedObjects“ openingHours”具有NSDate类型的值,可通过键“ start”和“ end”访问。 现在,为了以一种有意义的方式显示我的开放时间,我访问了各个日期的工作日和时间信息,到目前为止,使用这段代码可以正常工作:
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:mainDelegate.localeCode];
NSDateFormatter *weekday = [[[NSDateFormatter alloc] init] autorelease];
[weekday setLocale:locale];
[weekday setDateFormat: @"EEEE"];
[NSDateFormatter *time = [[[NSDateFormatter alloc] init] autorelease];
[time setLocale:locale];
[time setTimeStyle:NSDateFormatterShortStyle];
for (NSManagedObject *openingHour in openingHoursArray) {
NSLog(@"%@", [openingHour valueForKey:@"start"]);
NSDate *startDate = [openingHour valueForKey:@"start"];
NSDate *endDate = [openingHour valueForKey:@"end"];
NSString *startDay = [weekday stringFromDate:startDate];
NSString *endDay = [weekday stringFromDate:endDate];
NSString *startTime = [time stringFromDate:startDate];
NSString *endTime = [time stringFromDate:endDate];
if (![startDay isEqualToString:endDay]) {
[openingHoursString appendFormat:@"%@ - %@:\t%@ - %@ \n", startDay, endDay, startTime, endTime];
}
else {
[openingHoursString appendFormat:@"%@:\t%@ - %@ \n", startDay, startTime, endTime];
}
}
这给了我想要的输出:
星期四:10:00 AM-9:00 PM
星期五-星期日:10:00 AM-6:00 PM
星期一-星期三:10:00 AM-5:00 PM
现在的问题是:当然,我希望星期一的开放时间首先显示。 我需要按开始日期值的星期几对数组进行排序。 我尝试使用以下方法对其进行排序:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:TRUE];
[openingHoursArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
但是显然这是行不通的,因为它只是按日期排序,而不幸的是1970-01-01是星期四,因此星期四将是我的数组中按上述代码排序的第一项。
有人对如何“分类”有个好主意吗? :-)我对此一无所知。非常感谢!
这样的事情应该起作用:
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSArray *sortedArray = [openingHoursArray sortedArrayUsingComparator: ^(id obj1, id obj2) {
NSDate *startDate1 = [obj1 valueForKey:@"start"];
NSDate *startDate2 = [obj2 valueForKey:@"start"];
NSDateComponents *components1 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate1];
NSDateComponents *components2 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate2];
NSInteger weekday1 = [components1 weekday];
if (weekday1 == 1) weekday1 = 8; //Order sundays last
NSInteger weekday2 = [components2 weekday];
if (weekday2 == 1) weekday2 = 8;
return [[NSNumber numberWithInteger:weekday1] compare:[NSNumber numberWithInteger:weekday2]];
}];
代替使用NSSortDescriptor,可以使用NSArray的sortedArrayUsingSelector
或NSMutableArray的sortUsingSelector
方法,并将@selector(compare:)
作为选择器传递。
查看此答案以获取更多信息: 单击
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.