![](/img/trans.png)
[英]Sorting NSArray of Custom Objects by property - DBMetadata - Dropbox
[英]NSArray of Objects sorting with Custom Logic
我有具有自定義對象的NSSArray
,使用自定義邏輯對自定義對象進行排序
具有兩個屬性的自定義對象:
@property (nonatomic, strong) NSString *objectName;
@property (nonatomic, assign) BOOL isValidName;
如果isValidName屬性為false,則自定義對象應為最后的排序順序。 因為對象的isValidName屬性為true,則應按升序對屬性objectName進行排序。
我可以做的for loop
通過尋找具有對象屬性isValidName假,那么從數組中刪除的對象,然后在后陣,我可以添加它們是具有屬性的對象isValidName假排序。 我不想那樣做。
我想要類似下面的選項,但是它不起作用。 請幫忙
[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;
}];
我並沒有真正重新創建您所做的工作,但是我希望這對您有用:arr應該是NSMutableArray
NSSortDescriptor *validSort = [[NSSortDescriptor alloc] initWithKey:@"isValidName" ascending:NO];
NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES];
[arr sortUsingDescriptors:[NSArray validSort, nameSort, nil]];
因此,如果您的object.isValidName
= false,它將在推入true並按名稱排序后推送到
嘗試使用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);
我認為您幾乎已經擁有了,但是您不應該使用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:
避免創建新數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.