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

时间:2012-11-12 23:11:19

标签: objective-c xcode arrays

  

可能重复:
  Sorting NSString values as if NSInteger using NSSortDescriptor

我有一个我用NSMutableDictionary填充的数组..我用它:

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

myDicts的AllKeys是NSStrings ......比如123.423或423.343 ...我需要用增量数字对新的myArray进行排序.. 12.234 45.3343 522.533 5432.66等等

必须在@selector中插入什么才能正确执行此操作?感谢

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

您无法直接使用sortedArrayUsingSelector:。使用sortedArrayUsingComparator:并自行实施比较块。

有点像这样q / a:

Changing the sort order of -[NSArray sortedArrayUsingComparator:]

(事实上,该问题的代码可能会被复制/粘贴到您的代码中,并且只有在您将其从integerValue更改为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;
}];

答案 2 :(得分: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;
}

此处提供了更多信息:Sort NSArray using sortedArrayUsingFunction