簡體   English   中英

NSArray對象與自定義邏輯排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM