按升序对NSArray数字进行排序,但最后发送零

时间:2013-05-02 12:46:06

标签: ios objective-c nsarray nssortdescriptor

我有一个简单的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 行并在最后添加它们来手动重新订购,但我正在寻找最干净的解决方案。

5 个答案:

答案 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]];