我有NSSArray
个自定义对象,用自定义逻辑对自定义对象进行排序
自定义对象有两个属性:
@property (nonatomic, strong) NSString *objectName;
@property (nonatomic, assign) BOOL isValidName;
如果isValidName属性为false,则自定义对象应为最后排序顺序。对于对象isValidName属性为true,那么它应该与属性objectName以升序排序。
我可以通过查找具有属性isValidName false的对象来执行for loop
,然后从数组中删除对象,然后对数组进行排序,之后我可以添加具有属性isValidName false的对象。我不想这样做。
我想要类似下面的选项,但它不起作用。请帮忙
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSArray *sortedTopics = [obj sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
if (obj1.isValidName) {
return NSOrderedAscending;
}
return [obj1.objectName compare: obj2.objectName options:NSCaseInsensitiveSearch];
}];
obj = sortedTopics;
}];
答案 0 :(得分:1)
我真的没有重新创建你所做的东西,但我希望这对你有用:arr应该是[fbrt, i]
[abcd]
[fbrt]
NSMutableArray
因此,如果您的NSSortDescriptor *validSort = [[NSSortDescriptor alloc] initWithKey:@"isValidName" ascending:NO];
NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES];
[arr sortUsingDescriptors:[NSArray validSort, nameSort, nil]];
= false,它会推送到真实的并且按名称排序
答案 1 :(得分:0)
尝试使用NSPredicate
NSMutableArray *arrFinalSortedArray = [NSMutableArray new];
NSArray *yourObjectArray = @[@{@"isValidName":@"YES" ,@"objectName":@"ABC"},@{@"isValidName":@"NO",@"objectName":@"EFG"},@{@"isValidName":@"YES",@"objectName":@"BCD"},@{@"isValidName":@"YES",@"objectName":@"CDE"},@{@"isValidName":@"NO",@"objectName":@"DEF"}];
// filter for NO flag
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isValidName ==[c] %@", @"NO"];
NSArray *NOContainerArray = [yourObjectArray filteredArrayUsingPredicate:predicate];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"objectName" ascending:YES];
NOContainerArray = [NOContainerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
// filter for NO flag
predicate = [NSPredicate predicateWithFormat:@"isValidName ==[c] %@", @"YES"];
NSArray *YESContainerArray = [yourObjectArray filteredArrayUsingPredicate:predicate];
descriptor = [NSSortDescriptor sortDescriptorWithKey:@"objectName" ascending:YES];
YESContainerArray = [YESContainerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
// add to all YES and NO array into the final array which is the your result
[arrFinalSortedArray addObjectsFromArray:YESContainerArray];
[arrFinalSortedArray addObjectsFromArray:NOContainerArray];
NSLog(@"%@",arrFinalSortedArray);
答案 2 :(得分:0)
我认为你几乎拥有它,但你不应该使用enumerateObjectsUsingBlock
。而是使用sortedArrayUsingComparator
并将结果分配给新数组:
NSArray *sortedTopics = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
if (!obj1.isValidName)
return NSOrderedDescending;
return [obj1.objectName compare: obj2.objectName options:NSCaseInsensitiveSearch];
}];
如果您有NSMutableArray
,则可以在其上调用sortUsingComparator:
,避免创建新阵列。