2016-11-11 35 views
0

我有NSSArray具有自定义对象,要排序使用自定义逻辑的自定义对象NSArray的对象与定制逻辑排序的

具有自定义物体的两个属性:
@property (nonatomic, strong) NSString *objectName;
@property (nonatomic, assign) BOOL isValidName;

如果isValidName属性是假然后,自定义对象应该是最后一个排序顺序。对于isValidName属性为true的对象,则应该按照属性objectName进行升序排序。

我可以通过查找具有属性isValidName false的对象,然后从数组中删除对象,然后对数组进行排序,然后可以添加具有属性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; 

    }]; 

回答

1

我真的不重新创建你做的东西帮助,但我希望这会为你工作: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 =假时,将推到一前一后把它真实,也按名称排序

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); 
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:代替,避免创建一个新的阵列。