使用自定义逻辑排序的NSArray对象

时间:2016-11-11 08:12:22

标签: ios objective-c sorting nsarray

我有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;

    }];

3 个答案:

答案 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:,避免创建新阵列。