Сортировать массив с числовыми строками - PullRequest
4 голосов
/ 12 июля 2010

Здравствуйте, у меня есть массив людей, и я пытаюсь отсортировать их по возрасту, используя дескриптор сортировки. Поле возраста у пациента является строкой, поэтому при вызове:

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

Сортирует их, но сначала появляется 100, потому что в параметрах сравнения не используется числовой поиск.

Есть ли способы, которыми я все еще могу сортировать с помощью дескриптора, но, возможно, используя селектор, чтобы изменить способ сравнения строк?

Ответы [ 3 ]

1 голос
/ 12 июля 2010

Метод finderSortWithLocale (оба они взяты из Apple 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]];
1 голос
/ 10 февраля 2015

Я также столкнулся с той же проблемой и нашел ответ здесь. Вместо 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];

Я знаю, что уже очень поздно отвечать на ваш вопрос, но, возможно, это будет полезно для других. ^ _ ^

0 голосов
/ 12 июля 2010

Вы можете создать категорию на NSString, которая добавляет метод numericCompare: и которая вызывает [self compare:otherString options:NSNumericSearch]. Другой вариант - преобразовать поле возраста в NSNumber вместо NSString. Еще один вариант включает в себя блок NSComparator и sortUsingComparator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...