2010-08-04 55 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];