用包含数字的字符串对数组进行排序

6

可能是重复问题:
如何使用NSSortDescriptor将NSString值排序,就像使用NSInteger一样

我有一个数组,我用我的NSMutableDictionary填充它...然后我使用这个:

myArray =[[myDict allKeys]sortedArrayUsingSelector:@selector(IDONTKNOW:)];

我的字典中的所有键都是NSString类型,像123.423或423.343这样... 我需要按递增数字排序新的myArray... 例如12.234、45.3343、522.533、5432.66等等。

在@selector中应该插入什么以正确完成此操作?谢谢。


请在此处查看答案:http://stackoverflow.com/a/38347576/5165668 - OlDor
3个回答

20
你可以使用一个NSSortDescriptor,并将doubleValue作为关键字传递。
//sfloats would be your [myDict allKeys]
NSArray *sfloats = @[ @"192.5235", @"235.4362", @"3.235", @"500.235", @"219.72" ];
NSArray *myArray = [sfloats sortedArrayUsingDescriptors:
                    @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                                                    ascending:YES]]];

NSLog(@"Sorted: %@", myArray);

6
您不能直接使用sortedArrayUsingSelector:。请使用sortedArrayUsingComparator:,并自己实现一个比较块。就像这个问题/答案一样:Changing the sort order of -[NSArray sortedArrayUsingComparator:](实际上,该问题的代码可能可以从中复制/粘贴到您的代码中,在对四个将字符串转换为数字的调用更改为doubleValue之后,它将“只需工作”)。
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
    double n1 = [obj1 doubleValue];
    double n2 = [obj2 doubleValue];
    if (n1 > n2) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if (n1 < n2) {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

太棒了!救了我的一天。 - DzungPV

0
考虑使用 sortedArrayUsingFunction:。这可以让您定义一个自定义比较函数,用于比较元素。
myArray =[[myDict allKeys]sortedArrayUsingFunction:SortAsNumbers context:self];   

NSInteger SortAsNumbers(id id1, id id2, void *context)
{
    float v1 = [id1 floatValue];
    float v2 = [id2 floatValue];
    if (v1 < v2) {
        return NSOrderedAscending;
    } else if (v1 > v2) {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}

更多信息请点击这里:使用sortedArrayUsingFunction对NSArray进行排序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接