2011-11-08 71 views
18

我需要從另一個NSArray生成NSNumber的排序數組。我想使用sortedArrayUsingComparator:方法。我發現蘋果的文檔在這個例子:更改排序順序 - [NSArray sortedArrayUsingComparator:]

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

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

    return (NSComparisonResult)NSOrderedSame; 
}]; 

在這裏,我只是提供比較的塊,這是罰款。排序本身 - 隱藏在我身邊的那個使用這個塊的位 - 似乎是上升的。

我想知道我是否可以要求不同的排序順序外這一塊,還是我只需要左右翻轉<>的(或NSOrderedXXX的)?

回答

24

如果你想降序排序,那麼只需翻轉比較(或翻轉NSComparisonResult s)。當您可以直接在塊中控制參數時,不需要通過參數ascending:來擴大API。

4

只要改變邏輯:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 

if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
} 

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

爲清楚起見,可能是最好的讓這個具有類似名稱的方法:decendingSort

+1

,這是好的。當然,但除非你有橙色裝飾它 - 用紅色耶穌基督墨跡寫的交通註釋說明你已經翻轉了這個命令,在某個時候,這可能是一個潛在的調試噩夢。 構建一個排序描述符會更有意義,並且會自我評論,除非性能會受到嚴重打擊。 –

+0

@God排序描述符聽起來不錯,請提供一個用於比較的實現示例。 – zaph

4

-sortedArrayUsingComparator:的文檔:

「返回以升序列出了接收陣列的元件,如由給定NSComparator塊中指定的比較方法來確定的數組」。

所以你必須訴諸使用

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

但當然,這意味着滾動自己NSSortDescriptor的第一個對象,這可能滿足您的目的只是罰款。

+0

+1表示這實際上是記錄在案的。歡呼傑夫。 –

4

您可以翻轉操作員。

「隱藏的位」不關心上升或下降,因爲它不知道任何有關對象的信息。這就像詢問你的同事是否曲棍球大於或小於麝鼠一樣。內部實現只使用排序算法(可能使用數組大小​​來確定),並使用塊函數來比較兩個對象。