0

我有一个简单的NSArray,包含NSNumbers。

我以这种方式按升序对数组进行排序:

NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[_scores sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];

我的问题是,我希望NSNumbers 包含0在末尾而不是开头。这是我可能需要排序的数组类型(包含一些空NSNumber的 s 仅用于示例):

0
25
12
0
8
0

我的代码当然会像这样对数组进行排序:

0
0
0
8
12
25

我想要的是这样的:

8
12
25
0
0
0

当然,我可以通过删除行0并在最后添加它们来手动重新排序,但我正在寻找最干净的解决方案。

4

5 回答 5

13

使用比较器对数组进行排序。

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;
}];
于 2013-05-02T12:55:09.567 回答
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;

}];
于 2013-05-02T12:53:31.283 回答
1

方法一:

  • 第一步:对数组进行排序。

  • 第2步:将零移动到数组的末尾。

方法二:

  • 第 1 步:编写一个比较器函数,该函数0在任何其他值之后排序。

  • 第二步:对数组进行排序。

于 2013-05-02T12:53:18.760 回答
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 的火花。

于 2013-05-02T13:28:35.823 回答
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]];
于 2013-05-02T13:00:58.080 回答