我希望能够根据其标记值对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];
}];
我找到了in another SO question,但不确定如何添加条件
if (obj.tag == 0) {
// push to end of array
}
有什么建议吗?
答案 0 :(得分:4)
你已经找到了比较器块的想法;您需要在该块中执行的操作就是说标记为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;
}];
答案 1 :(得分:0)
// 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到最后。