按降序对NSArray进行sorting
我有一个NSArray
的NSNumber
对象,我已经成功地按升序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]; }
好处是你可以在任何地方重复使用,而不必用反向迭代编写循环。 坏事是你必须写更多的代码:)
有几种方法:
- 写一个比较函数并将其传递给
sortUsingFunction:context:
- 使用
sortUsingComparator:
这需要一个块。 (仅适用于Mac OS X 10.6及更高版本以及iOS 4.0及更高版本。) - 使用
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];
我们可以简单地通过使用sortUsingSelector
来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实际上,我并没有取笑任何人。 但是在简单的逻辑中,我们可以按这种方式降序排列数组。 不需要使用任何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];