按降序对NSArray进行sorting

我有一个NSArrayNSNumber对象,我已经成功地按升序sorting使用以下内容:

 [myArray sortedArrayUsingSelector:@selector(compare:)] 

不过,我需要按降序sorting。 我认为compare:只是按升序sorting。 虽然我可以去扭转NSArray ,但我很好奇是否有一个更简单或更有效的方法去做这件事。

编辑 :我发现这个问题提供了一个简单的方法来反向迭代NSArray

 for (id someObject in [myArray reverseObjectEnumerator]) 

这工作正常,我想这是一个很好的简单的解决scheme,但我很好奇,是否有一种方法来指定sorting降序。

使用sorting描述符

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

另一种方式,即时通讯,也是不错的:写另一个reverseCompare与类别:

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

好处是你可以在任何地方重复使用,而不必用反向迭代编写循环。 坏事是你必须写更多的代码:)

有几种方法:

  1. 写一个比较函数并将其传递给sortUsingFunction:context:
  2. 使用sortUsingComparator:这需要一个块。 (仅适用于Mac OS X 10.6及更高版本以及iOS 4.0及更高版本。)
  3. 使用sortUsingDescriptors:并传递至less一个ascending属性为false的sorting描述符的数组。

在前两种情况下,您的比较应该简单地返回否定比较器您通常使用(例如, compare:返回。 最后一个涉及较less的自定义代码,所以这是我使用的。

使用sortarrayusingcomparator方法

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

通过颠倒对象的顺序,您将获得降序

我有一个mutableArray,并想按“数字”键降序sorting。 “数字”键是一个像“12345”,“12346”这样的string。 这样,我曾尝试过,看起来很好。 希望能帮到你!

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

对于示例数据就像这样,我们要基于sId键对NSArray进行sorting。

 <__NSArrayM 0x7ffc725af1d0>( { sId = 3; vName = ABC; }, { sId = 10; vName = DEF; }, { sId = 9; vName = GHI; }, { sId = 7; vName = JKL; }, { sId = 1; vName = MNO; } ) 

解决scheme如下

 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); 

comareselect器必须返回NSComparisonResult。 这实际上是你的函数,所以你可以编写另一个函数,返回相反的结果按降序sorting。

Dr. Touch网站在NSArray上有一个很好的类别实现来创build一个自我sorting的数组。 这可以修改,以保持适当顺序的sorting。

如果你需要基于ABCD升序然后使用下面的代码

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

我们可以简单地通过使用sortUsingSelectorsortUsingSelector 。 代码如下;

 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实际上,我并没有取笑任何人。 但是在简单的逻辑中,我们可以按这种方式降序排列数组。 不需要使用任何types的descriptors或任何其他复杂的东西。 入门级程序员将会更容易。

使用下面的代码来sorting数组的基础上你想sorting数组(例如名称,代码,地址,emp_id等…)

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; return [array sortedArrayUsingDescriptors:sortDescriptors];