Iphone 按降序对NSArray排序
我有一个Iphone 按降序对NSArray排序,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我有一个NSArray的NSNumber对象,我已使用以下方法成功地按升序排序: [myArray sortedArrayUsingSelector:@selector(compare:)] 但是,我需要按降序对其进行排序。我认为compare:只按升序排序。虽然我可以着手扭转NSArray,但我很好奇是否有更简单或更有效的方法来实现这一点 编辑:我找到了一种简单的方法来反向迭代NSArray: for (id someObject in [myArray reverseObjectEnume
NSArray
的NSNumber
对象,我已使用以下方法成功地按升序排序:
[myArray sortedArrayUsingSelector:@selector(compare:)]
但是,我需要按降序对其进行排序。我认为compare:
只按升序排序。虽然我可以着手扭转NSArray,但我很好奇是否有更简单或更有效的方法来实现这一点
编辑:我找到了一种简单的方法来反向迭代NSArray
:
for (id someObject in [myArray reverseObjectEnumerator])
这很好,我想这是一个很好的简单解决方案,但我很好奇是否有一种方法可以按降序指定排序。另一种方法,imo,也很好:写另一个反向与类别比较:
@implementation NSNumber (Utility)
- (NSComparisonResult)reverseCompare:(NSNumber *)aNumber {
return [aNumber compare:self];
}
好的方面是,您可以在任何地方重用,而不必使用反向迭代编写循环。糟糕的是您必须编写更多的代码:)comare选择器必须返回NSComparisonResult。它实际上是您的函数,因此您可以编写另一个函数,返回相反的结果以按降序排序。有几种方法:
sortUsingFunction:context:
sortUsingComparator:
,它会占用一个块。(仅适用于Mac OS X 10.6及更高版本和iOS 4.0及更高版本。)排序描述符:
,并传递至少一个排序描述符的数组,该排序描述符的升序属性为false
compare:
)。最后一个涉及较少的自定义代码,因此我将使用它。使用排序描述符
NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self"
ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
该网站在NSArray上有一个很好的类别实现,可以创建一个自排序数组。可以对其进行修改,以使排序保持在适当的顺序 如果需要基于升序中的ABCD,请使用以下代码
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];
使用这样的比较方法进行排序
NSArray *sortedArray = [array sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2){
return [obj2 compare:obj1];
}];
通过颠倒对象的顺序,您将获得降序。例如,数据如下,我们希望根据sId键对NSArray进行排序。
<__NSArrayM 0x7ffc725af1d0>(
{
sId = 3;
vName = ABC;
},
{
sId = 10;
vName = DEF;
},
{
sId = 9;
vName = GHI;
},
{
sId = 7;
vName = JKL;
},
{
sId = 1;
vName = MNO;
}
)
(
{
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);
NSArray*sortedArray=[aroptions sortedArray使用比较器:^n比较结果(id obj1,id obj2){
如果([[obj1 valueForKey:@“sId”]integerValue]>[[obj2 valueForKey:@“sId”]integerValue]){
返回(NSComparisonResult)或撤销;
}
如果([[obj1 valueForKey:@“sId”]integerValue]<[obj2 valueForKey:@“sId”]integerValue]){
返回(NSComparisonResult)或删除;
}
返回(NSComparisonResult)命令名;
}];
NSLog(@“排序服务数组为::%@”,sortedArray);
我有一个可变数组,想用“number”键按降序排序。“number”键是类似“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];
我们只需使用
或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);
NSMutableArray*arr=[[NSMutableArray alloc]initWithObjects:…objects.];
//也可以使用NSArray。
[arr sortUsingSelector:@selector(比较:选项:)];
NSString*温度;
int i,j;
i=0;
j=[arr计数];
对于(i=0;i使用以下代码根据要对tge数组进行排序的键(例如名称、代码、地址、emp_id等)对数组进行排序
不一定。如果对象是内置Cocoa类(如NSString)的实例,您必须将自定义比较方法分类到类中。谢谢。我最终使用了这个方法,我喜欢它的简单性。@Blaenk:嗨,我回滚了您的编辑,因为arrayWithObject:
不是打字错误。NSArray确实有这样一个方法。而且,冒号后面的空格是经过深思熟虑的。打字错误是您ad arayWithObject,而不是arrayWithObject。然后我就被迷住了。但这很好。这个答案很短,很贴切,也很聪明:它就像一个符咒,我曾经对NSString数组进行排序。你需要一个排序数组来应用它。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
return [array sortedArrayUsingDescriptors:sortDescriptors];