【问题标题】:Sort an NSArray in Descending Order按降序对 NSArray 进行排序
【发布时间】:2011-03-25 01:53:30
【问题描述】:

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

[myArray sortedArrayUsingSelector:@selector(compare:)]

但是,我需要按 降序 顺序对其进行排序。我认为compare: 仅按升序排序。虽然我可以扭转NSArray,但我很好奇是否有更简单或更有效的方法来做到这一点。

编辑:我找到了this question,它提供了一种简单的方法来反向迭代NSArray:

for (id someObject in [myArray reverseObjectEnumerator])

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

【问题讨论】:

标签: iphone objective-c cocoa


【解决方案1】:

使用排序描述符

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

【讨论】:

  • 谢谢。我最终使用了它,我喜欢它非常简单。
  • @Blaenk:您好,我已经撤回了您的编辑,因为arrayWithObject: 不是错字。 NSArray 确实有这样的方法。此外,冒号后面的空格是故意的。
  • 错字是你有 arayWithObject,而不是 arrayWithObject。然后我被带走了。不过没关系。
【解决方案2】:

另外一种方式,imo,也不错:再写一个reverseCompare with category:

@implementation NSNumber (Utility)

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

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

【讨论】:

    【解决方案3】:

    像这样使用 sortarrayusingcomparator 方法

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

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

    【讨论】:

    • 它就像一个魅力,我曾经对一个 NSString 数组进行排序。您需要一个排序数组来应用它。
    【解决方案4】:

    有几种方法:

    1. 编写一个比较函数并将其传递给sortUsingFunction:context:。
    2. 使用sortUsingComparator:,它需要一个块。 (仅适用于 Mac OS X 10.6 及更高版本以及 iOS 4.0 及更高版本。)
    3. 使用sortUsingDescriptors:,并传递一个包含至少一个ascending 属性为false 的排序描述符的数组。

    在前两种情况下,您的比较应该简单地返回您通常使用的比较器(例如,compare:)返回的否定。最后一个涉及的自定义代码较少,所以我会使用它。

    【讨论】:

      【解决方案5】:

      我有一个 mutableArray,想用“数字”键按降序排序。 “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】:

        例如数据是这样的,我们想根据 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】:

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

          【讨论】:

          • 不一定。如果对象是内置 Cocoa 类(例如 NSString)的实例,则必须将自定义比较方法分类到该类中。
          【解决方案8】:

          Dr. Touch 网站在 NSArray 上很好地实现了一个类别来创建一个自排序数组。这可以修改为以任何适当的顺序保持排序。

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              我们可以简单地使用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 或任何其他复杂的东西。而且对于入门级程序员来说会更容易。

              【讨论】:

                【解决方案11】:

                使用以下代码根据您要对 tge 数组进行排序的键(例如 name 、 code、address、emp_id 等...)对 Array 进行排序

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-16
                  • 2012-02-19
                  • 2011-01-09
                  • 2016-03-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多