根据派生值对 NSArray 进行排序...搭便车?



我希望能够根据对象的标记值对NSArray进行排序。问题是,如果标签是0,我希望它被推到数组的末尾。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:TRUE];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [self.array sortedArrayUsingDescriptors:sortDescriptors];

这将返回所有在索引前面带有标记的对象(就像应该的那样(。

我希望标签值>0在前面,所有标签值0在后面。

我认为区块会起作用,类似于:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

我在另一个SO问题中发现,但不确定如何添加条件

if (obj.tag == 0) {
    // push to end of array
}

有什么建议吗?

您已经找到了比较器块的概念;在该块中,您所需要做的就是说,标记为0的对象排序在其他对象之后。

sortedArray = [self.array sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSInteger first = [a tag];
    NSInteger second = [b tag];
    if (first == 0) {
        return (second == 0 ? NSOrderedSame : NSOrderedDescending);
    }
    if (second == 0) {
        return NSOrderedAscending;
    }
    if (first < second) {
        return NSOrderedAscending;
    }
    if (first > second) {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}];
// sort the part without tag = 0
NSPredicate* p = [NSPredicate predicateWithFormat: @"tag != 0"];
NSSortDescriptor* sort = [NSSortDescriptor sortDescriptorWithKey: @"tag" ascending: YES];
NSMutableArray* result = [[[videos filteredArrayUsingPredicate: p]
                           sortedArrayUsingDescriptors: @[ sort ]] mutableCopy];
// append the part with tag = 0;
p = [NSPredicate predicateWithFormat: @"tag = 0"];
[result addObjectsFromArray: [videos filteredArrayUsingPredicate: p]];

另一种方法是,将原始数组拼接为两个部分,对不带0的部分进行排序,然后将带0的一部分附加到末尾。

最新更新