我希望能够根据对象的标记值对NSArray进行排序。问题是,如果标签是0,我希望它被推到数组的末尾。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:TRUE];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [self.array sortedArrayUsingDescriptors:sortDescriptors];
这将返回所有在索引前面带有标记的对象(就像应该的那样(。
我希望标签值>0在前面,所有标签值0在后面。
我认为区块会起作用,类似于:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
我在另一个SO问题中发现,但不确定如何添加条件
if (obj.tag == 0) {
// push to end of array
}
有什么建议吗?
您已经找到了比较器块的概念;在该块中,您所需要做的就是说,标记为0的对象排序在其他对象之后。
sortedArray = [self.array sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSInteger first = [a tag];
NSInteger second = [b tag];
if (first == 0) {
return (second == 0 ? NSOrderedSame : NSOrderedDescending);
}
if (second == 0) {
return NSOrderedAscending;
}
if (first < second) {
return NSOrderedAscending;
}
if (first > second) {
return NSOrderedDescending;
}
return NSOrderedSame;
}];
// sort the part without tag = 0
NSPredicate* p = [NSPredicate predicateWithFormat: @"tag != 0"];
NSSortDescriptor* sort = [NSSortDescriptor sortDescriptorWithKey: @"tag" ascending: YES];
NSMutableArray* result = [[[videos filteredArrayUsingPredicate: p]
sortedArrayUsingDescriptors: @[ sort ]] mutableCopy];
// append the part with tag = 0;
p = [NSPredicate predicateWithFormat: @"tag = 0"];
[result addObjectsFromArray: [videos filteredArrayUsingPredicate: p]];
另一种方法是,将原始数组拼接为两个部分,对不带0的部分进行排序,然后将带0的一部分附加到末尾。