按降序排序NSArray

时间:2010-08-04 04:49:33

标签: iphone objective-c cocoa

我有NSArray NSNumber[myArray sortedArrayUsingSelector:@selector(compare:)] 个对象,我已使用以下内容按升序成功排序:

compare:

但是,我需要按降序顺序对此进行排序。我认为NSArray只按升序排序。虽然我可以撤销NSArray,但我很好奇是否有更简单或更有效的方法来实现这一目标。

编辑:我发现this question提供了一种简单的方法来反向迭代for (id someObject in [myArray reverseObjectEnumerator])

{{1}}

这很好用,我想这是一个很好的简单解决方案,但我很好奇是否有办法按降序指定排序。

11 个答案:

答案 0 :(得分:80)

使用排序描述符

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];

答案 1 :(得分:12)

另一种方式,imo,也很好:用类别编写另一个reverseCompare:

@implementation NSNumber (Utility)

- (NSComparisonResult)reverseCompare:(NSNumber *)aNumber {
  return [aNumber compare:self];
}

好处是你可以在任何地方重用,而不必用反向迭代来编写循环。不好的是你必须编写更多的代码:)

答案 2 :(得分:6)

有几种方法:

  1. 编写比较函数并将其传递给sortUsingFunction:context:
  2. 使用sortUsingComparator:,这需要一个块。 (仅适用于Mac OS X 10.6及更高版本以及iOS 4.0及更高版本。)
  3. 使用sortUsingDescriptors:,并传递至少一个ascending属性为false的排序描述符的数组。
  4. 在前两种情况下,您的比较应该简单地返回您通常使用的比较器(例如,compare:)返回的否定。最后一个涉及较少的自定义代码,所以这就是我使用的。

答案 3 :(得分:6)

像这样使用sortarrayusingcomparator方法

NSArray *sortedArray = [array sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2){
        return [obj2 compare:obj1];
    }];

通过反转对象的顺序,您将获得降序

答案 4 :(得分:3)

我有一个mutableArray,想要按“number”键降序排序。 “number”键是一个字符串,如“12345”,“12346”。这种方式我尝试过,看起来很好。希望能帮到你!

NSComparisonResult result;

NSArray *arrTem = [multableArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if([obj1 valueForKey:@"number"] > [obj2 valueForKey:@"number"])
         result = NSOrderedDescending;
    result = NSOrderedSame;
}];

return [[NSMutableArray alloc]initWithArray:arrTem];

答案 5 :(得分:2)

示例数据就像这样,我们希望根据sId键对NSArray进行排序。

<__NSArrayM 0x7ffc725af1d0>(
{
    sId = 3;
    vName = ABC;
},
{
    sId = 10;
    vName = DEF;
},
{
    sId = 9;
    vName = GHI;
},
{
    sId = 7;
    vName = JKL;
},
{
    sId = 1;
    vName = MNO;
}
)

解决方案如下

NSArray *sortedArray = [arrOptions sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if ([[obj1 valueForKey:@"sId"] integerValue] > [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([[obj1 valueForKey:@"sId"] integerValue] < [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
NSLog(@"Sorted Service Array is ::%@",sortedArray);

答案 6 :(得分:1)

comare选择器必须返回NSComparisonResult。它实际上是你的函数,所以你可以编写另一个函数,返回相反的结果以降序排序。

答案 7 :(得分:1)

Dr. Touch网站在NSArray上有一个很好的类别实现来创建一个自排序数组。可以对其进行修改以使排序保持适当的顺序。

答案 8 :(得分:0)

如果您需要在升序中使用ABCD,请使用以下代码

NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];

答案 9 :(得分:0)

我们只需使用sortUsingSelector即可。代码如下;

NSMutableArray *arr=[[NSMutableArray alloc]initWithObjects: ..objects.. ];
//Can also use NSArray.
[arr sortUsingSelector:@selector(compare:options:)];
NSString *temp;
int i,j;
i=0;
j=[arr count];
for(i=0;i<([arr count]-1);i++)
{
    temp=[arr objectAtIndex:i];
    [arr replaceObjectAtIndex:i withObject:[arr objectAtIndex:j]];
    [arr replaceObjectAtIndex:j withObject:temp];
    j--;
}
NSLog(@"New array is:%@",arr);

你可能会认为这是什么愚蠢的答案:D:D实际上,我不是在取笑任何人。但是在简单的逻辑中,我们可以通过这种方式按降序对数组进行排序。无需使用任何类型的descriptors或任何其他复杂的东西。入门级程序员会更容易。

答案 10 :(得分:-1)

使用以下代码根据要对tge数组进行排序的键(例如,名称,代码,地址,emp_id等等)对Array进行排序。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
return [array sortedArrayUsingDescriptors:sortDescriptors];