根据派生值对NSArray进行排序......有一个障碍?

时间:2013-04-11 15:10:38

标签: ios objective-c nsarray nssortdescriptor

我希望能够根据其标记值对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];
}];

我找到了in another SO question,但不确定如何添加条件

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

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

你已经找到了比较器块的想法;您需要在该块中执行的操作就是说标记为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;
}];

答案 1 :(得分:0)

// 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到最后。