如何通过两个时间属性对NSArray中的自定义对象进行排序

时间:2014-08-07 11:31:05

标签: ios objective-c nsmutablearray nssortdescriptor

我有对象Item,它只有两个NSDate属性 从这些属性来看,对我来说唯一重要的部分就是时间 如果有可能这不是NSDate,那么它只能是@"14:30"@"17:30"的NSString。 我有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 DateTimeADateTimeB并不一定是NSDate他们只能是字符串,但我必须能够按这两个字符排序属性。
对此有什么解决方案吗?

2 个答案:

答案 0 :(得分:1)

试试:

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];
                         }];

这只是示例,但您可以自定义它以符合您的要求。 在这个例子中,我假设DateTimeA总是NSString,但你应该首先将它颊,如果它是NSDate,你可以省略格式位。

例如:

if ([i1.DateTimeA isKindOfClass:[NSDate class]])
    NSDate* date1 = i1.DateTimeA;
if ([i2.DateTimeA isKindOfClass:[NSDate class]])
    NSDate* date2 = i2.DateTimeA;

return [date2 compare:date1];

答案 1 :(得分:1)

这应该是技巧

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];

还有一件事要避免使用大写字母启动iVars和属性名称,这确实令人困惑。

希望这有帮助。