Ios 如何按两个时间属性对NSArray中的自定义对象进行排序
我有objectIos 如何按两个时间属性对NSArray中的自定义对象进行排序,ios,objective-c,nsmutablearray,nssortdescriptor,Ios,Objective C,Nsmutablearray,Nssortdescriptor,我有objectItem,它只有两个NSDate属性。 从这些属性来看,对我来说唯一重要的部分就是时间。 如果可能的话,它不必是NSDate,也可以是NSString,只有一个@“14:30”和@“17:30” 我有10个不同时间的对象,它们位于NSMutableArray 我需要对所有这些对象进行排序,以便将它们加载到表中。 我尝试了两个属性,但运气不佳(实际上此代码适用于一个属性): NSDate *now = [NSDate date]; NSCalendar *calendar
Item
,它只有两个NSDate
属性。从这些属性来看,对我来说唯一重要的部分就是时间。
如果可能的话,它不必是NSDate,也可以是NSString,只有一个
@“14:30”
和@“17:30”
我有10个不同时间的对象,它们位于
NSMutableArray
我需要对所有这些对象进行排序,以便将它们加载到表中。
我尝试了两个属性,但运气不佳(实际上此代码适用于一个属性):
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
[components setHour:12];
NSDate *todayA = [calendar dateFromComponents:components];
[components setHour:11];
NSDate *todayB = [calendar dateFromComponents:components];
[components setHour:10];
NSDate *todayC = [calendar dateFromComponents:components];
Item* i1 = [[Item alloc] init];
i1.DateTimeA = todayA;
Item* i2 = [[Item alloc] init];
i2.DateTimeA = todayB;
Item* i3 = [[Item alloc] init];
i3.DateTimeA = todayC;
[array addObject:i1];
[array addObject:i2];
[array addObject:i3];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"DateTimeA" ascending:NO];
NSArray *orderedArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
正如我所说的Item
DateTimeA
和DateTimeB
不必是NSDate
它们只能是字符串,但我必须能够根据这两个属性进行排序。有什么解决办法吗?试试:
array = [array sortedArrayUsingComparator:^(Item *i1, Item *i2) {
NSDateFormatter* df1 = [[NSDateFormatter alloc] init];
[df1 setDateFormat:@"d/LLL/yy"]; // <-- make sure it match your date format
NSDate* date1 = [df1 dateFromString:i1.DateTimeA];
NSDate* date2 = [df1 dateFromString:i2.DateTimeA];
return [date2 compare:date1];
}];
这应该是诀窍
NSArray *sortedArray = [array sortedArrayUsingComparator:^(Item *i1, Item *i2) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"HHmmss"];
NSDate* date1A = [dateFormatter dateFromString:[dateFormatter stringFromDate:i1.DateTimeA]];
NSDate* date2A = [dateFormatter dateFromString:[dateFormatter stringFromDate:i2.DateTimeA]];
NSDate* date1B = [dateFormatter dateFromString:[dateFormatter stringFromDate:i1.DateTimeB]];
NSDate* date2B = [dateFormatter dateFromString:[dateFormatter stringFromDate:i2.DateTimeB]];
switch ([date1A compare:date2A]) {
case NSOrderedSame:
return [date1B compare:date2B];
break;
default:
return [date1A compare:date2A];
break;
}
}];
它不是很漂亮,但它可以做你想要的,请注意,如果你将DateTimeA和DateTimeB存储为字符串格式,如HH:mm或其他格式,则不需要这样做,你只需要执行以下操作:
[dateFormatter dateFromString:DateTimeA];
还有一件事要避免在IVAR和属性名称的开头使用大写字母,因为大写字母会让人感到困惑
希望这能有所帮助。如果我理解正确,您只想按时间排序,而不管日期是从哪天开始的?是的,先生。只有时间。正如我所说,它可以是和字符串只与时间。如果你费心阅读NSArray规范,你会看到其他几种“SorterDarrayUsing…”方法。
[dateFormatter dateFromString:DateTimeA];