如何对 NSArray 中的数字进行排序?

Posted

技术标签:

【中文标题】如何对 NSArray 中的数字进行排序?【英文标题】:How to sort numbers in NSArray? 【发布时间】:2012-06-24 16:48:55 【问题描述】:

我无法拼凑出如何做到这一点。

我从一个 plist 中获取我的数组,这个数组充满了数字(在 plist 中设置)。现在我需要做的就是对它们进行排序,使它们降序,但我无法解决。

【问题讨论】:

【参考方案1】:

试试这个代码?

 NSArray *array = /* loaded from file */;
 array = [array sortedArrayUsingSelector: @selector(compare:)];

【讨论】:

但是选择器方法的内容是什么呢?这就是吸引我的原因。 -compare: 方法是为 NSNumber 实例定义的:developer.apple.com/library/mac/documentation/Cocoa/Reference/…: 这就是我的意思。也许我误解了文档,但我尝试过使用和不使用 compare 方法,它总是让应用程序崩溃,说无法识别的选择器。 这很奇怪。那么你的阵列一定有问题。 看来(根据您对另一个答案的评论)您已经用数字 as strings 而不是 as numbers 填充了 .plist .【参考方案2】:

以下将数字按升序排序,然后将结果反转以降序给出数字:

NSArray *sorted = [[[array sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];

上一个问题还有其他一些选择: Sort an NSArray in Descending Order

【讨论】:

我遇到了 -[__NSCFString sortedArrayUsingSelector:]: unrecognized selector sent to instance 的崩溃。 您确定在NSArray 上调用sortedArrayUsingSelector: 吗?您似乎正在通过NSString 呼叫sortedArrayUsingSelector:。您可能应该检查从 Plist 加载的数据结构。 @Josh Kahane,如果是这样,您很可能遇到内存管理问题,因为您的 array 指针指向 NSString 对象。忘记保留/太多 [auto] 发布? 这个答案完全回答了问题,因为它对数组降序进行排序。【参考方案3】:

这是使用比较块的众多方法之一。这段代码 sn-p 对于任何要排序的数字数组都很方便。 对于升序:

AscendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    if ([obj1 integerValue] > [obj2 integerValue]) 
      return (NSComparisonResult)NSOrderedDescending;
    

    if ([obj1 integerValue] < [obj2 integerValue]) 
      return (NSComparisonResult)NSOrderedAscending;
    
    return (NSComparisonResult)NSOrderedSame;
  ];

降序:

DescendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    if ([obj1 integerValue] > [obj2 integerValue]) 
      return (NSComparisonResult)NSOrderedAscending;
    

    if ([obj1 integerValue] < [obj2 integerValue]) 
      return (NSComparisonResult)NSOrderedDescending;
    
    return (NSComparisonResult)NSOrderedSame;
  ];

【讨论】:

为什么不直接使用 NSNumber compare: 我使用了这种方法,因为即使我的一些数据是数字,我也将所有内容都存储为字符串。此方法可以比较存储为字符串的数字,与比较相反:方法【参考方案4】:

它对我有用:

NSSortDescriptor *sortIdClient = 
[NSSortDescriptor sortDescriptorWithKey:@"campaignValue"
                              ascending:NO
                             comparator: ^(id obj1, id obj2)

    return [obj1 compare:obj2 options:NSNumericSearch];

 ];

NSArray *sortDescriptors = @[sortIdClient];

NSArray *arrTemp = [self.allCampaignsList sortedArrayUsingDescriptors:sortDescriptors];

【讨论】:

【参考方案5】:

这将解决问题:

 NSArray *array = /* loaded from file */;
 array = [array sortedArrayUsingSelector: @selector(compare:)];

【讨论】:

请去掉使文本显示为代码的额外缩进

以上是关于如何对 NSArray 中的数字进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 NSArray 进行排序并在 NSString 中访问?

使用 NSPredicate 对 NSArray 进行排序,然后存储在一个新数组中

使用值对 NSDictionary 的 NSArray 进行排序

今天按 NSDate 对 NSArray 进行排序

按 2 级深的键值关系对 NSArray 进行排序

如何按数组计数对嵌套 NSArray 的 NSArray 进行排序?