2010-08-04 72 views
34

我有,我已經按升序排列使用以下成功排序NSNumberNSArray對象:排序一個NSArray按降序

[myArray sortedArrayUsingSelector:@selector(compare:)] 

不過,我需要梳理這降序秩序。我認爲compare:只是按升序排序。雖然我可以去扭轉NSArray,但我很好奇是否有更簡單或更有效的方式來執行此操作。

編輯:我發現this question它提供了一個簡單的方法來扭轉迭代的NSArray

for (id someObject in [myArray reverseObjectEnumerator]) 

這工作得很好,我想這是一個很好的簡單的解決方案,但我很好奇,是否沒有辦法按降序來指定排序。

+0

這個答案是短暫的,甜和聰明:http://stackoverflow.com/a/586529/999934 – Rob 2013-05-03 15:28:09

回答

75

使用一種描述

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

謝謝。我最終使用這個,我喜歡它很簡單。 – 2010-08-04 21:41:41

+0

@Blaenk:嗨,我回滾了你的編輯,因爲'arrayWithObject:'不是拼寫錯誤。 NSArray真的有這樣一種方法。另外,冒號後的空格是故意的。 – JeremyP 2010-08-05 08:10:09

+1

錯字是你有arayWithObject,而不是arrayWithObject。然後我被帶走了。但沒關係。 – 2010-08-05 20:33:10

12

的另一種方式,國際海事組織,也不錯:另寫reverseCompare與類別:

@implementation NSNumber (Utility) 

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

的好處是,你可以重複使用無處不在,不必寫出具有反向迭代循環。壞事是你必須寫更多的代碼:)

1

comare選擇器必須返回NSComparisonResult。它實際上是你的函數,所以你可以編寫另一個函數,返回相反的結果以降序排序。

+1

不一定。如果對象是內置Cocoa類的實例(如NSString),則必須將自定義比較方法分類到類中。 – 2010-08-04 05:15:55

6

有幾種方法:

  1. 寫一個比較函數,並把它傳遞給sortUsingFunction:context:
  2. 使用sortUsingComparator:,這需要一個塊。 (僅適用於Mac OS X 10.6及更高版本和iOS 4.0及更高版本。)
  3. 使用sortUsingDescriptors:,並傳遞至少一個排序描述符的數組,其中ascending屬性爲false。

在前兩種情況下,您的比較應簡單地返回您通常使用的比較器(例如,compare:)返回的否定。最後一個涉及較少的自定義代碼,所以這就是我所使用的。

1

Dr. Touch網站有一個很好的實現上的NSArray類別來創建自排序陣列。這可以修改,以適當的順序保持排序。

0

如果需要在上升基於ABCD然後使用通過反轉對象的順序,下面的代碼

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

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

使用sortarrayusingcomparator方法,你將獲得一個降序

+0

它像一個魅力,我用來排序一個NSString數組。你需要一個有序的數組來應用這個。 – andreskwan 2017-11-29 17:01:33

2

對於示例數據就像這樣,我們要基於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); 
3

我有一個mutableArray並希望在以 「數字」 鍵降序排序。 「數字」鍵是一個像「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]; 
+0

將來使用ctrl + k編寫代碼。祝你好運.. – 2016-05-05 08:02:19

+0

謝謝!!!!!!!! – AmyNguyen 2016-07-28 04:59:42

0

我們可以簡單地通過使用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或任何其他複雜的東西。入門級程序員將更容易。

-1

上要排序TGE陣列使用下面的代碼進行排序鍵的基礎上陣列(例如名稱,代碼,地址,EMP_ID等)

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO]; 

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
return [array sortedArrayUsingDescriptors:sortDescriptors];