2012-06-24 43 views
8

这让我感动不已,我无法拼凑出如何做到这一点。在NSArray中排序数字?

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

希望有人能帮忙,谢谢。

回答

34

尝试这个代码?

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

但你会选择方法的内容是什么?这是让我感到满意的。 –

+0

哪种选择器方法? –

+0

为'NSNumber'实例定义了'-compare:'方法:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html#// apple_ref/occ/instm/NSNumber/compare: –

11

以下将依次递增的数字进行排序,然后反向结果给降序排列的数字:

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

此之前的问题有其他一些备选方案: Sort an NSArray in Descending Order

+0

我正在用' - [__ NSCFString sortedArrayUsingSelector:]:发送到实例的无法识别的选择器来崩溃。 –

+0

你确定在'NSArray'上调用'sortedArrayUsingSelector:'?您似乎在'NSString'上调用'sortedArrayUsingSelector:'。您应该检查从Plist加载的数据结构。 – mttrb

+0

@Josh Kahane,如果是这样,你最有可能遇到内存管理的问题,因为你的''''指针指向'NSString'对象。忘了保留/太多[自动]发布? – ivanzoid

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]; 
10

这是使用比较块的许多方法之一。此代码片段适用于任何需要排序数字的数组。 对于升序:

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; 
    }]; 
+0

为什么不只是使用NSNumber'比较:'? – vikingosegundo

0

这样便解决了问题:

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

请删除使文本显示为代码的额外缩进 – YakovL