使用两个 NSSortDescriptor 来过滤数组
Use Two NSSortDescriptor to filter array
我想使用字典值 "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];
如果分组是指让它们成为单独的数组,那么您需要一个 NSPredicate 而不是 NSSortDescriptor 作为计数键。
试试这个(据我所知,数组中充满了 NSDictionary
的实例,所以我对它进行了强制转换。如果该假设不正确,则 NSPredicate 不难更改为其他类型或使用 KVC 变得更通用):
NSSortDescriptor *sortNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending: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];
我想使用字典值 "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];
如果分组是指让它们成为单独的数组,那么您需要一个 NSPredicate 而不是 NSSortDescriptor 作为计数键。
试试这个(据我所知,数组中充满了 NSDictionary
的实例,所以我对它进行了强制转换。如果该假设不正确,则 NSPredicate 不难更改为其他类型或使用 KVC 变得更通用):
NSSortDescriptor *sortNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending: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];