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

Posted

技术标签:

【中文标题】在目标 c 中对负数和正数进行排序【英文标题】:Sorting negative and positive numbers in objective c 【发布时间】:2013-08-29 11:49:16 【问题描述】:

我通过网络服务列出了一个项目的数量百分比。我得到的响应是一个字典数组,类似于下面的代码。我需要它的排序格式

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

【问题讨论】:

你在混合字符串和整数? 它是 JSON,我认为标准规定在纯数字的情况下可以避免引号。 看起来负数会自动转换成字符串格式。 这有帮助吗? ***.com/questions/2393386/… 你说得对,但恐怕是NSLog的效果。 【参考方案1】:
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);

如果您希望 sortedResult 按降序排列,则在 中互换 num1 和 num2 返回语句。

【讨论】:

不要使用valueForKey: 访问字典的元素。 您还可以利用现代 Objective-C 语法并实现类似: return [obj1[@"price"] compare:obj2[@"price"]]; 【参考方案2】:

如果价格存储为NSNumber 对象,那么@***foe 链接(Best way to sort an NSArray of NSDictionary objects?) 中的方法应该可以工作:

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

但从您上次的评论来看,价格似乎存储为字符串。 在这种情况下,以下工作,因为floatValue 将每个字符串转换为 浮点值:

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

【讨论】:

如果 JSON 可信的话,它可能是 NSNumberNSString 对象的混合体。 @***foe:实际上字典中的负 NSNumber 被 NSLogged 为带引号的“-12”,因此无法从 NSLog 输出中看出是数字还是字符串。 - 但 OP 现在已确认您的链接有所帮助。 @MartinR 我相信即使在NSNumbers 的情况下使用price.floatValue 也不会造成伤害。 @GabrielePetronella:没错。但是,如果我正确解释了Objective-C message tracing 的输出,浮点数会被转换回 NSNumber 进行比较,这样效率会降低。 如果您先验地知道输入类型,那绝对不是要走的路。如果您不这样做(字符串或数字),它将提供通用解决方案【参考方案3】:

您没有对数字进行排序。您正在根据常见的“价格”元素对字典进行排序:

sortedArray = [numberArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *a, NSDictionary *b) 
    return [a[@"price"] compare:b[@"price"]];
];

【讨论】:

【参考方案4】:
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;
];

【讨论】:

以上是关于在目标 c 中对负数和正数进行排序的主要内容,如果未能解决你的问题,请参考以下文章

正负混合排序,正数在前,负数在后

在 C 中对链表进行排序

数组628. 三个数的最大乘积

在向量c ++中对复数进行排序

在 C++ 中对向量进行分组排序

在C中对链表进行排序[关闭]