0

我希望能够根据标签值对对象的 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 question中找到,但不确定如何添加条件

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

有什么建议么?

4

2 回答 2

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;
}];
于 2013-04-11T15:19:06.237 回答
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 的部分附加到末尾。

于 2013-04-11T19:15:22.220 回答