使用两个 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 从 Swift 4 的核心数据中获取密钥