使用两个NSSortDescriptor过滤数组

时间:2017-03-27 01:11:29

标签: ios objective-c nsarray nssortdescriptor

我想使用字典值“Name”和“Count”对数组进行排序。它将按字母顺序命名,并根据计数将名称拆分为两个分组。

大于0

小于等于0

我当前的实现看起来像这样,但它不能正确地拆分组。

NSSortDescriptor *sortCountDescriptor = [[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO];
NSSortDescriptor *sortNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

NSArray * sortDescriptors = [NSArray arrayWithObjects:sortCountDescriptor, sortNameDescriptor, nil];

NSArray *sortedArray = [myArrayToSort sortedArrayUsingDescriptors:sortDescriptors];

return [sortedArray mutableCopy];

1 个答案:

答案 0 :(得分:3)

如果通过分组意味着将它们分成不同的数组,则需要NSPredicate而不是NSSortDescriptor来计算密钥。

试试这个(根据我的理解,数组中充满了NSDictionary的实例,所以我使用了它。如果这个假设不正确,NSPredicate就不难改变到其他类型或者通过KVC更加通用):

NSSortDescriptor * sortNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@" name"升序:NO];     NSArray * sortDescriptors = [NSArray arrayWithObjects:sortNameDescriptor,nil];

NSArray *sortedArray = [myArrayToSort sortedArrayUsingDescriptors:@[sortNameDescriptor]];

NSPredicate *zeroOrLessPredicate = [NSPredicate predicateWithBlock:^BOOL(id  _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
    if ([[((NSDictionary*)evaluatedObject) objectForKey:@"count"] integerValue] <= 0) {
        return YES;
    }
    else {
        return NO;
    }
}];
NSArray *zeroOrLessArray = [sortedArray filteredArrayUsingPredicate:zeroOrLessPredicate];

NSPredicate *moreThanZeroPredicate = [NSCompoundPredicate notPredicateWithSubpredicate:zeroOrLessPredicate];
NSArray *moreThanZeroArray = [sortedArray filteredArrayUsingPredicate:moreThanZeroPredicate];