it-swarm.com.ru

Сортировка значений NSString, как будто NSInteger с использованием NSSortDescriptor

Я создал дескриптор сортировки для сортировки ответа plist, поступающего с моего сервера. Это хорошо работает с ключом сортировки, имеющим значения до 9. С более чем 10 элементами я вижу резкие результаты с ключом сортировки, расположенным в порядке = 1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9

NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort" ascending:YES];
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]];

Как заставить его расположить в правильном порядке 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11?

28
Abhinav

Вы можете сделать это, внедрив пользовательский блок сравнения при создании NSSortDescriptor:

NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sort" ascending:YES comparator:^(id obj1, id obj2) {

    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]];

Смотрите документацию Apple здесь

44
jonkroll

[list sortUsingSelector:@selector(localizedStandardCompare:)]; отсортирует список «по-человечески» (поэтому «11» будет последним, а не между «1» и «2»). Но если вы действительно хотите трактовать эти строки как числа, вы должны сначала сделать их нумерацией!

38
Vincent Gable
NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort.intValue" ascending:YES];
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]];

Сортировка по значению целого числа.

16
lucidbeing

Вам нужно сравнить свои строки с параметром NSNumericSearch :

NSNumericSearch
Числа в строках сравниваются с использованием числового значения, то есть Name2.txt <Name7.txt <Name25.txt.

что требует для сравнения метода compare:options: .

Для этого дескриптор сортировки может использовать блок NSComparator Block :

[NSSortDescriptor sortDescriptorWithKey:@"self"
                              ascending:YES
                             comparator:^(NSString * string1, NSString * string2){
                                            return [string1 compare:string2
                                                            options:NSNumericSearch];
 }];

Или, действительно, вы можете пропустить дескриптор сортировки и просто отсортировать массив напрямую , используя тот же блок:

[unsortedList sortedArrayUsingComparator:^NSComparisonResult (NSString * string1, NSString * string2){
    return [string1 compare:string2
                    options:NSNumericSearch];
 }];
11
Josh Caswell
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"11",@"2",@"3",@"1", nil];
[list sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSInteger firstInteger = [obj1 integerValue];
    NSInteger secondInteger = [obj2 integerValue];
    if( firstInteger > secondInteger) return NSOrderedDescending;
    if( firstInteger == secondInteger) return NSOrderedSame;
    return NSOrderedAscending; // edited
}];

Нет гарантий о производительности

7
FluffulousChimp

Все вышеперечисленные методы требуют хорошего знания основ для реализации; но для новичков я предлагаю самый простой способ - использовать нативный метод блока

NSArray* sortedArr =[fetchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {

    int aValue = [[a valueForKey:@"subgroupId"] intValue];
    int bValue = [[b valueForKey:@"subgroupId"] intValue];

    return aValue > bValue;
}];
0
Subash V

вход

{
    "seats": [{
        "seatNumber": "1"
    }, {
        "seatNumber": "10"
    }, {
        "seatNumber": "2"
    }]
}

сортировка с использованием [NSSortDescriptor sortDescriptorWithKey: @ "seatNumber" ascending: YES селектор: @selector (localizedStandardCompare :)]]. Ключ должен использовать localizedStandardCompare. Это решит вашу проблему.

NSArray *seats = [self.seats sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"seatNumber" ascending:YES selector:@selector(localizedStandardCompare:)]]];

Результат

{
    "seats": [{
        "seatNumber": "1"
    }, {
        "seatNumber": "2"
    }, {
        "seatNumber": "10"
    }]
}

документация: https://developer.Apple.com/documentation/foundation/nsstring/1409742-localizedstandardcompare

0
starfall