6

可能重复:
使用 NSSortDescriptor 将 NSString 值排序为 NSInteger

我有一个用我的 NSMutableDictionary 填充的数组。我使用这个:

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

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

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

4

3 回答 3

20

您可以使用NSSortDescriptorand passdoubleValue作为键。

//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);
于 2012-11-12T23:19:50.827 回答
6

你不能直接使用sortedArrayUsingSelector:. 自己使用sortedArrayUsingComparator:和实现一个比较块。

有点像这样的q/a:

更改 -[NSArray sortedArrayUsingComparator:] 的排序顺序

(事实上​​,该问题的代码可能会被复制/粘贴到您的代码中,并且一旦您将其从 更改为integerValuedoubleValue进行四个 convert-string-to-number 调用,它就会“正常工作”):

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;
}];
于 2012-11-12T23:15:26.473 回答
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 进行排序

于 2012-11-12T23:22:00.573 回答