Сортировка чисел с помощью NSSortDescriptor

Я снова застрял в другой проблеме, но спустя долгое время.

На этот раз у меня есть база данных (Core Data) с атрибутом numbers, который содержит целые числа, такие как 213879,123,4,345,56567 и так далее.

Мне нужно получить данные в порядке возрастания номеров, аналогичном порядку alphabetically.

Я делаю это способом, указанным ниже,

fetchRequest.sortDescriptors=[NSArray arrayWithObject:
      [NSSortDescriptor sortDescriptorWithKey:@"numbers" 
                                    ascending:YES 
                                     selector:@selector(compare:)]];

но, к сожалению, он сравнивает только 1-ю цифру каждого числа, что означает, что если есть 2 числа, например 123 и 321, он будет сравнивать 1 (first digit of first number) с 3 (first digit of second number) и сортировать их.

Запуталось, когда пришли 123 и 111 (одинаковые первые цифры всех чисел).

Если я что-то делаю не так или SortDescriptor работает таким образом? Мне нужно решение для сортировки чисел по возрастанию 123,133,213,451,516 аналогичным образом.

Что нужно запомнить Фактически атрибут numbers будет содержать целые числа с цифрами больше 6, например 1234567,234568,235481

Спасибо всем, кто мне очень помогает в ожидании.


person iOmi    schedule 14.12.2012    source источник
comment
Первая реакция заключалась в том, что вы сравниваете строки, но теперь вы сказали, что это NSNumber, я предлагаю вам перепроверить с помощью [obj className], это говорит NSNumber или NSString   -  person Anoop Vaidya    schedule 14.12.2012
comment
Покажите, пожалуйста, модель данных. Если бы это был числовой атрибут, он бы не работал так. В вашем вопросе чего-то не хватает.   -  person jrturton    schedule 14.12.2012


Ответы (3)


Кажется, ваш атрибут имеет тип NSString. Убедитесь, что вы добрались до NSNumber, тогда сортировка будет работать должным образом.

Нет необходимости selector:@selector(compare:) в дескрипторе сортировки, так как в любом случае это значение по умолчанию.

person Mundi    schedule 14.12.2012
comment
Спасибо, что скоро переиграете. Атрибут имеет тип NSNumber. - person iOmi; 14.12.2012
comment
Измените свой вопрос следующим образом: (1) показать пример нежелательного результата сортировки и (2) код, который вы используете для хранения значения атрибута. - person Mundi; 14.12.2012
comment
:: Спасибо, дружище, все сработало. На самом деле была небольшая ошибка в том, что у меня Numbers были неправильные числа, которые вызывали проблему. Я исправил числа и применил ваше решение, и оно сработало для меня очень хорошо. Спасибо еще раз. - person iOmi; 14.12.2012

Попробуй это:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc]initWithKey:@"rank"  ascending:YES selector:@selector(localizedStandardCompare:)];
person Darshit Shah    schedule 27.02.2014
comment
+1, localizedStandardCompare хорошо работает для сортировки чисел с использованием NSSortDescriptor в NSArray. - person Nazik; 09.05.2014
comment
Я не понимаю, почему, но у меня есть объекты со свойством @property (strong, nonatomic) NSNumber *price;, и я установил это свойство с помощью (т.е.) object.price = @ (5727). И если я проверю if ([[object price] isKindOfClass:[NSString class]]) - это правда. - person WildMassacre; 03.07.2015

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

это работает отлично для меня идеально

person Arsalan    schedule 08.01.2013
comment
Проблема в том, что когда у вас есть хранилище SQLite, вы не можете использовать компаратор в NSSortDescriptor ... - person Josip B.; 29.05.2015