我有一个简单的NSArray
,其中包含NSNumber
。
我按照这种方式按升序对数组进行排序:
NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[_scores sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];
我的问题是,我希望包含NSNumber
的{{1}}在最后而不是在开头。这是我可能需要排序的数组(仅为示例包含一些空0
):
NSNumber
我的代码当然按如下方式对数组进行排序:
0
25
12
0
8
0
我想要的是:
0
0
0
8
12
25
当然,我可以通过删除8
12
25
0
0
0
行并在最后添加它们来手动重新订购,但我正在寻找最干净的解决方案。
答案 0 :(得分:13)
使用comparator对数组进行排序。
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] == 0 && [obj2 integerValue] == 0)
{
return (NSComparisonResult)NSOrderedSame;
}
if ([obj1 integerValue] == 0)
{
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj2 integerValue] == 0)
{
return (NSComparisonResult)NSOrderedAscending;
}
if ([obj1 integerValue] > [obj2 integerValue])
{
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue])
{
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
答案 1 :(得分:4)
这将解决您的问题,
NSArray *sortedScores = [_scores sortedArrayUsiHelperComparator:^(id obj1, id obj2){
if([obj1 integerValue]==0 && [obj2 integerValue]==0){
return (NSComparisonResult) NSOrderedSame;
}else if([obj1 integerValue]==0){
return (NSComparisonResult) NSOrderedDescending;
}else if([obj2 integerValue]==0){
return (NSComparisonResult) NSOrderedAscending;
}
if([obj1 integerValue] >[obj2 integerValue]) return (NSComparisonResult) NSOrderedDescending;
if([obj1 integerValue] <[obj2 integerValue]) return (NSComparisonResult) NSOrderedAscending;
return (NSComparisonResult) NSOrderedSame;
}];
答案 2 :(得分:1)
方法1:
第1步:对数组进行排序。
第2步:将零移动到数组的末尾。
方法2:
步骤1:编写比较函数,在任何其他值之后命令0
。
第2步:对数组进行排序。
答案 3 :(得分:1)
@ JeremyP的答案提供了正确的排序,可能就是你所追求的。
但是,为了完整性,可以使用过滤器和标准compare:
方法:
NSArray *numbers = @[@12, @0, @10, @15, @0, @3];
NSArray *sortedPositiveNumbers = [[numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self > 0"]] sortedArrayUsingSelector:@selector(compare:)];
NSArray *zeroes = [numbers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self = 0"]];
NSArray *result = [sortedPositiveNumbers arrayByAddingObjectsFromArray:zeroes];
感谢Caleb的火花。
答案 4 :(得分:0)
您可以使用NSPredicate
过滤您不想要的值。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 0"];
NSMutableArray *filteredArray = [[_scores filteredArrayUsingPredicate:predicate] mutableCopy];
NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[filteredArray sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];