代码之家  ›  专栏  ›  技术社区  ›  Jorge Israel Peña

按降序排列

  •  34
  • Jorge Israel Peña  · 技术社区  · 14 年前

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

    [myArray sortedArrayUsingSelector:@selector(compare:)]
    

    不过,我需要整理一下 降序 命令。我认为 compare: 不可变数组 ,我很好奇是否有更简单或更有效的方法来做这件事。

    编辑 :我发现 this question 不可变数组 :

    for (id someObject in [myArray reverseObjectEnumerator])
    

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

    11 回复  |  直到 7 年前
        1
  •  81
  •   JeremyP    9 年前

    使用排序描述符

    NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                                ascending: NO];
    return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
    
        2
  •  12
  •   vodkhang    14 年前

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

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

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

        3
  •  6
  •   Peter Hosey    14 年前

    有几种方法:

    1. sortUsingFunction:context:
    2. 使用 sortUsingComparator: ,需要一个街区(仅适用于Mac OS X 10.6及更高版本和iOS 4.0及更高版本。)
    3. 使用 sortUsingDescriptors: ,并传递至少一个排序描述符的数组 ascending

    在前两种情况下,您的比较应该简单地返回您通常使用的比较器的否定值(例如。, compare:

        4
  •  6
  •   Eman Shedeed    10 年前

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

    通过颠倒对象的顺序,您将获得降序

        5
  •  3
  •   NSNoob    8 年前

    我有一个可变数组,想用“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];
    
        6
  •  2
  •   Hardik Thakkar    9 年前

    例如,数据是这样的,我们希望根据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);
    
        7
  •  1
  •   Nava Carmon    14 年前

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

        8
  •  1
  •   gnuchu    14 年前
        9
  •  0
  •   Hardik Mamtora    10 年前

    NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
    NSArray *descriptors=[NSArray arrayWithObject: descriptor];
    NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];
    
        10
  •  0
  •   Soorej Babu    9 年前

    我们可以通过使用 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);
    

    descriptors 或者其他复杂的东西。对于入门级程序员来说,这会更容易。

        11
  •  -1
  •   Shubham JAin    8 年前

    使用以下代码根据要对tge数组进行排序的键(例如名称、代码、地址、emp\u id等)对数组进行排序

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];
    
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    return [array sortedArrayUsingDescriptors:sortDescriptors];