Iphone 按降序对NSArray排序

Iphone 按降序对NSArray排序,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我有一个NSArray的NSNumber对象,我已使用以下方法成功地按升序排序: [myArray sortedArrayUsingSelector:@selector(compare:)] 但是,我需要按降序对其进行排序。我认为compare:只按升序排序。虽然我可以着手扭转NSArray,但我很好奇是否有更简单或更有效的方法来实现这一点 编辑:我找到了一种简单的方法来反向迭代NSArray: for (id someObject in [myArray reverseObjectEnume

我有一个
NSArray
NSNumber
对象,我已使用以下方法成功地按升序排序:

[myArray sortedArrayUsingSelector:@selector(compare:)]
但是,我需要按降序对其进行排序。我认为
compare:
只按升序排序。虽然我可以着手扭转NSArray,但我很好奇是否有更简单或更有效的方法来实现这一点

编辑:我找到了一种简单的方法来反向迭代
NSArray

for (id someObject in [myArray reverseObjectEnumerator])

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

另一种方法,imo,也很好:写另一个反向与类别比较:

@implementation NSNumber (Utility)

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

好的方面是,您可以在任何地方重用,而不必使用反向迭代编写循环。糟糕的是您必须编写更多的代码:)

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

有几种方法:

  • 编写一个比较函数并将其传递给
    sortUsingFunction:context:
  • 使用
    sortUsingComparator:
    ,它会占用一个块。(仅适用于Mac OS X 10.6及更高版本和iOS 4.0及更高版本。)
  • 使用
    排序描述符:
    ,并传递至少一个排序描述符的数组,该排序描述符的
    升序属性为false
  • 在前两种情况下,您的比较应该简单地返回您通常使用的比较器返回的结果的否定值(例如,
    compare:
    )。最后一个涉及较少的自定义代码,因此我将使用它。

    使用排序描述符

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

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

    如果需要基于升序中的ABCD,请使用以下代码

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

    使用这样的比较方法进行排序

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

    通过颠倒对象的顺序,您将获得降序。例如,数据如下,我们希望根据sId键对NSArray进行排序。

    <__NSArrayM 0x7ffc725af1d0>(
    {
        sId = 3;
        vName = ABC;
    },
    {
        sId = 10;
        vName = DEF;
    },
    {
        sId = 9;
        vName = GHI;
    },
    {
        sId = 7;
        vName = JKL;
    },
    {
        sId = 1;
        vName = MNO;
    }
    )
    
    (
    {
    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);
    
    NSArray*sortedArray=[aroptions sortedArray使用比较器:^n比较结果(id obj1,id obj2){
    如果([[obj1 valueForKey:@“sId”]integerValue]>[[obj2 valueForKey:@“sId”]integerValue]){
    返回(NSComparisonResult)或撤销;
    }
    如果([[obj1 valueForKey:@“sId”]integerValue]<[obj2 valueForKey:@“sId”]integerValue]){
    返回(NSComparisonResult)或删除;
    }
    返回(NSComparisonResult)命令名;
    }];
    NSLog(@“排序服务数组为::%@”,sortedArray);
    
    我有一个可变数组,想用“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];
    

    我们只需使用
    或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);
    
    NSMutableArray*arr=[[NSMutableArray alloc]initWithObjects:…objects.];
    //也可以使用NSArray。
    [arr sortUsingSelector:@selector(比较:选项:)];
    NSString*温度;
    int i,j;
    i=0;
    j=[arr计数];
    
    对于(i=0;i使用以下代码根据要对tge数组进行排序的键(例如名称、代码、地址、emp_id等)对数组进行排序


    不一定。如果对象是内置Cocoa类(如NSString)的实例,您必须将自定义比较方法分类到类中。谢谢。我最终使用了这个方法,我喜欢它的简单性。@Blaenk:嗨,我回滚了您的编辑,因为
    arrayWithObject:
    不是打字错误。NSArray确实有这样一个方法。而且,冒号后面的空格是经过深思熟虑的。打字错误是您ad arayWithObject,而不是arrayWithObject。然后我就被迷住了。但这很好。这个答案很短,很贴切,也很聪明:它就像一个符咒,我曾经对NSString数组进行排序。你需要一个排序数组来应用它。
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];
    
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    return [array sortedArrayUsingDescriptors:sortDescriptors];