Сортировка по строке и с плавающей точкой не работает

У меня есть поля имени и расстояния в массиве данных, которые я хочу отсортировать; Я могу сортировать по одному, но не по обоим вместе. Я хочу, чтобы данные сначала сортировались по имени, а затем по расстоянию, но когда я использую их вместе, сортировка всегда выполняется по первому дескриптору в списке, а вторая, похоже, игнорируется.

    NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] 
                                    initWithKey:@"NAME"
                                    ascending:YES
                                    selector:@selector(localizedStandardCompare:)];

    NSSortDescriptor *distanceSort = [[NSSortDescriptor alloc]        
                                        initWithKey:@"DISTANCE" 
                                        ascending:YES];

    sortedArray = [featureSet.features sortedArrayUsingDescriptors:@[nameSort, distanceSort]];

    [super.tableView reloadData];

1 ответ

Решение

Поведение, которое вы видите, определенно имеет смысл - "A&W #0338" предшествует "A&W #0339", поэтому больше ничего не нужно определять для сортировки расстояния.

Если все ваши данные структурированы таким образом - имя, за которым следует #000, - вы можете убрать числа для сортировки, и тогда ваша дистанционная сортировка сможет выполнить свою работу. Вы можете сделать это на уровне модели, разделив заголовок на два свойства: имя и номер местоположения, или вы можете сделать это внутри дескриптора сортировки.

    NSSortDescriptor *nameSort = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES comparator:^NSComparisonResult(NSString *str1, NSString *str2) {
        NSString *title1 = [[str1 componentsSeparatedByString:@" #"] firstObject];
        NSString *title2 = [[str2 componentsSeparatedByString:@" #"] firstObject];
        return [title1 compare:title2];
    }];

Если вы используете эту сортировку по имени и ваша сортировка по расстоянию, "A&W #0338", то после "A & W # 0339" появится "25 км".

Другие вопросы по тегам