2012-06-24 78 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