在目标c中对负数和正数进行sorting

我通过webservice列出了一个数量百分比像一个项目的东西。我得到的响应是一个类似于下面的代码的字典数组。我需要一个有序的格式

NSArray *numberArray = [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-12.0], @"price", nil], [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-86.0],@"price", nil], [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-8.0],@"price", nil], [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:12.0],@"price", nil], [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:2.0],@"price", nil], [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:112.0],@"price", nil], nil]; 

这是JSON响应的日志

 [ { price = "-12"; }, { price = "-86"; }, { price = "-8"; }, { price = 12; }, { price = 2; }, { price = 112; } ] 

 NSArray *sortedResult = [numberArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSNumber *num1 = [obj1 objectForKey:@"price"]; NSNumber *num2 = [obj2 objectForKey:@"price"]; return [num1 compare:num2]; }]; NSLog(@"---%@",sortedResult); 

如果你想sorting的结果降序,然后交换num1和num2 in
返回语句。

如果价格存储为NSNumber对象,那么应该从@ trojanfoe的链接( 对NSArray对象的NSArray进行sorting的最佳方法? )的方法:

 NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]; NSArray *sorted = [numberArray sortedArrayUsingDescriptors:@[sd]]; 

但从你最后的评论看来,价格存储为string 。 在这种情况下,以下工作,因为floatValue将每个string转换为浮点值:

 NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"price.floatValue" ascending:YES]; NSArray *sorted = [numberArray sortedArrayUsingDescriptors:@[sd]]; 

你不sorting数字。 根据一个共同的“价格”元素,你正在sorting字典:

 sortedArray = [numberArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *a, NSDictionary *b) { return [a[@"price"] compare:b[@"price"]]; }]; 
 sortedArray = [numberArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { float first = [(NSNumber *)a[@"price"] floatValue]; float second = [(NSNumber *)b[@"price"] floatValue]; if (first > second) { return NSOrderedDescending; } else if (first < second) { return NSOrderedAscending; } return NSOrderedSame; }];