使用两个 NSSortDescriptor 过滤数组

Posted

技术标签:

【中文标题】使用两个 NSSortDescriptor 过滤数组【英文标题】:Use Two NSSortDescriptor to filter array 【发布时间】:2017-03-27 01:11:29 【问题描述】:

我想使用字典值“名称”和“计数”对数组进行排序。这将是按字母顺序排列的名称,并根据计数将名称分成两组。

大于 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】:

如果通过分组是指使它们成为单独的数组,那么您需要一个 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];

【讨论】:

在我编辑我的时没有看到这个答案。我同意。最终结果可能是两个数组的数组,外部或内部数组可能需要是可变的(由 OP 暗示)。

以上是关于使用两个 NSSortDescriptor 过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController 与许多 NSSortDescriptor

CKQuery 的 distanceToLocation 上没有 NSSortDescriptor?

NSSortDescriptor 有两个同样重要的键

NSSortDescriptor 从 Swift 4 的核心数据中获取密钥

NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法

使用 NSSortDescriptor 对 NSOrderedSet 进行排序