使用数字字符串对数组进行排序

4

你好,我有一个人员数组,想要使用排序描述符按照年龄对其进行排序。 患者的年龄字段是一个字符串,所以当调用:

ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
[personList sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]];

它进行了排序,但是100出现在第一位,因为它在比较选项中没有使用numericSearch。

是否有一种方法可以仍然使用描述符进行排序,但是可能使用选择器来更改如何比较字符串?

3个回答

1
我也遇到了同样的问题,并在这里找到了答案。 不要使用NSString比较,而是使用对象属性,例如age。 示例:按升序排列:
NSArray *sortedArray = [_arrayCaptureLeadList sortedArrayUsingComparator:^(Person *obj1, Person *obj2) {
            return [obj1.age compare:obj2.age options:NSNumericSearch];
        }];

NSMutableArray *filterResultArray = [NSMutableArray arrayWithArray:sortedArray];

按降序排列:

NSArray *sortedArray = [_arrayCaptureLeadList sortedArrayUsingComparator:^(Person *obj1, Person *obj2) {
            return [obj2.age compare:obj1.age options:NSNumericSearch];
        }];

NSMutableArray *filterResultArray = [NSMutableArray arrayWithArray:sortedArray];

我知道回答你的问题已经很晚了,但希望这对其他人有所帮助。^_^


1

finderSortWithLocale方法(这两个都来自苹果API):

int finderSortWithLocale(Person *person1, Person *person2, void *locale)
{
    static NSStringCompareOptions comparisonOptions = NSNumericSearch;

    NSRange string1Range = NSMakeRange(0, [string1 length]);
    NSString *age1 = person1.age;
    NSString *age2 = person2.age;
    return [age1 compare:age2
                    options:comparisonOptions
                    range:string1Range
                    locale:(NSLocale *)locale];
}

如何调用此方法(编辑:在Person数组上调用函数):

    NSArray *sortedArray = [personList sortedArrayUsingFunction:finderSortWithLocale
                                         context:[NSLocale currentLocale]];

但是我该如何调用人的年龄呢?因为我需要从我的人对象中获取年龄键。 - Matt
编辑代码以实现此功能。基本上,只要您在个人对象上使用它,就可以编辑finderSort:方法来实现此功能。 - Jesse Naugher
OO,我明白你的意思了。finderSortWithLocale应该放在哪里?是在patient对象类中吗? - Matt
你可以将它放在执行排序操作的类中,或者如果经常使用,你可以将其放在单例中,这可能是最简单的方式。然后你就可以调用"simpleton.finderSortWithLocale"。 - Jesse Naugher
一个注意事项:如果这段代码不起作用,你可能需要将person1和person2的参数改为id,并在函数内部将其强制转换为Person类型,然后获取它的年龄。 - Jesse Naugher

0
你可以在 NSString 上创建一个类别,添加一个方法 numericCompare:,并调用 [self compare:otherString options:NSNumericSearch]。另一个选项是将年龄字段转换为 NSNumber 而不是 NSString。还有一种选择涉及 NSComparator 块和 sortUsingComparator。

我该如何使用NSComparator块呢? 因为我还需要从数组中获取键吧? - Matt
sortUsingComparator: 方法仅适用于 iOS 4.0 及以上版本,而且我对块不是很了解,无法立即编写代码,因此您可能需要使用函数选项进行排序。 - lucius

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