我有NSArray
NSNumber
个[myArray sortedArrayUsingSelector:@selector(compare:)]
个对象,我已使用以下内容按升序成功排序:
compare:
但是,我需要按降序顺序对此进行排序。我认为NSArray
只按升序排序。虽然我可以撤销NSArray
,但我很好奇是否有更简单或更有效的方法来实现这一目标。
编辑:我发现this question提供了一种简单的方法来反向迭代for (id someObject in [myArray reverseObjectEnumerator])
:
{{1}}
这很好用,我想这是一个很好的简单解决方案,但我很好奇是否有办法按降序指定排序。
答案 0 :(得分:80)
使用排序描述符
NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self"
ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
答案 1 :(得分:12)
另一种方式,imo,也很好:用类别编写另一个reverseCompare:
@implementation NSNumber (Utility)
- (NSComparisonResult)reverseCompare:(NSNumber *)aNumber {
return [aNumber compare:self];
}
好处是你可以在任何地方重用,而不必用反向迭代来编写循环。不好的是你必须编写更多的代码:)
答案 2 :(得分:6)
有几种方法:
sortUsingFunction:context:
。sortUsingComparator:
,这需要一个块。 (仅适用于Mac OS X 10.6及更高版本以及iOS 4.0及更高版本。)sortUsingDescriptors:
,并传递至少一个ascending
属性为false的排序描述符的数组。在前两种情况下,您的比较应该简单地返回您通常使用的比较器(例如,compare:
)返回的否定。最后一个涉及较少的自定义代码,所以这就是我使用的。
答案 3 :(得分:6)
像这样使用sortarrayusingcomparator方法
NSArray *sortedArray = [array sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2){
return [obj2 compare:obj1];
}];
通过反转对象的顺序,您将获得降序
答案 4 :(得分:3)
我有一个mutableArray,想要按“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];
答案 5 :(得分: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);
答案 6 :(得分:1)
comare选择器必须返回NSComparisonResult。它实际上是你的函数,所以你可以编写另一个函数,返回相反的结果以降序排序。
答案 7 :(得分:1)
Dr. Touch网站在NSArray上有一个很好的类别实现来创建一个自排序数组。可以对其进行修改以使排序保持适当的顺序。
答案 8 :(得分:0)
如果您需要在升序中使用ABCD,请使用以下代码
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];
答案 9 :(得分: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
或任何其他复杂的东西。入门级程序员会更容易。
答案 10 :(得分:-1)
使用以下代码根据要对tge数组进行排序的键(例如,名称,代码,地址,emp_id等等)对Array进行排序。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
return [array sortedArrayUsingDescriptors:sortDescriptors];