【问题标题】:Sort an array with numeric strings使用数字字符串对数组进行排序
【发布时间】:2010-07-12 16:31:46
【问题描述】:

您好,我有一组人员,我正在尝试使用排序描述符按年龄对他们进行排序。 患者的年龄字段是一个字符串,因此调用时:

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

它对它们进行排序,但首先出现 100,因为它没有在比较选项中使用 numericSearch。

有没有办法我仍然可以使用描述符进行排序,但也许使用选择器来更改如何比较字符串?

【问题讨论】:

    标签: iphone arrays sorting string


    【解决方案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];
    }
    

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

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

    【讨论】:

    • 但是我怎么称呼人的年龄。因为我需要从我的 Person 对象中获取年龄密钥
    • 编辑代码来做到这一点。基本上你可以编辑 finderSort: 方法来做到这一点,只要你只在你的 person 对象上使用它。
    • OO 好的,我明白你在说什么。我在哪里放置finderSortWithLocale?在患者对象类中?
    • 你可以把它放在类中进行排序,或者如果它经常使用你可以把它放在你的单例中,如果你愿意的话,这将是最简单的方式。然后你打电话给 simpleton.finderSortWithLocale
    • 注意:如果此代码不起作用,您可能必须使用 id 作为 person1 和 person2 的参数,然后将其类型转换为函数内的人员,然后获取它的年龄。
    【解决方案2】:

    我也遇到了同样的问题,发现answer here. 而不是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];
    

    我知道现在回复您的问题已经很晚了,但这可能对其他人有所帮助。 ^_^

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我怎样才能使用 NSComparator 块?因为我还不需要从数组中获取密钥吗?
      • sortUsingComparator: 方法仅在 iOS 4.0 上可用,而且我对块的了解还不够,无法将代码写下来,因此您可能希望使用排序使用功能选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2013-06-29
      • 2015-01-16
      相关资源
      最近更新 更多