IOS сортирует NSMutableArray для числового поля

#ios #sorting

#iOS #сортировка

Вопрос:

Я надеюсь, что есть кто-то снаружи, кто может мне в этом помочь:

У меня есть несортированный массив словарей, внутри которого есть СТРОКОВОЕ поле (Km), содержащее числа (например, 12,0; 1,2; 6,4). Если я выполню обычную СОРТИРОВКУ, массив будет отсортирован таким образом: 1,2 12,0 6,4

Но он должен быть отсортирован таким образом: 1,2 6,4 12,0

У кого-нибудь есть пример кода, как это сделать? Я с нетерпением жду ответа.

Спасибо и с уважением, Марко

Отредактируйте мой код для дальнейшего понимания:

 NSMutableArray *tempArray = [[NSArray alloc] init];
self.Digger = tempArray;
[tempArray release];

self.Digger = [self.Diggers objectForKey:@"Rows"];

NSSortDescriptor * sort = [[[NSSortDescriptor alloc] initWithKey:@"KM" ascending:true] autorelease]; [self.Digger sortUsingDescriptors:[NSArray arrayWithObject:sort]];
self.Digger = sort;
 

Но это дает мне следующую ошибку в журнале:
-[Количество NSSortDescriptor]: нераспознанный селектор, отправленный экземпляру

Ответ №1:

Лучше всего помещать числа в словарь как NSNumbers, а не строки. Это позволяет избежать двух проблем:

1 Локализация десятичных чисел, 1,2 против 1,2, которые будут работать по-разному в зависимости от местоположения пользователя в мире.
2. Желателен естественный порядок сортировки чисел.

 NSArray *a = [NSArray arrayWithObjects:
              [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:12.0] forKey:@"Km"],
              [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat: 1.2] forKey:@"Km"],
              [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat: 6.4] forKey:@"Km"],
              nil];

NSSortDescriptor * sort = [[[NSSortDescriptor alloc] initWithKey:@"Km" ascending:true] autorelease];
NSArray *sa = [a sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
NSLog(@"sa: %@", sa);
 

Вывод NSLog:

 2011-10-30 10:08:58.791 TestNoARC[86602:f803] sa: (
                                                   {
                                                       Km = "1.2";
                                                   },
                                                   {
                                                       Km = "6.4";
                                                   },
                                                   {
                                                       Km = 12;
                                                   }
                                                   )
 

Комментарии:

1. Сортировка работает именно так, и именно по этой причине я установлю этот ответ в качестве своего принятого ответа. Большое спасибо CocoaFu!

2. Но теперь у меня есть проблема с Хью!

3. в этом случае, вероятно, лучше всего сформулировать хороший вопрос и создать другой вопрос.

4. Но теперь у меня есть проблема с Хью! Я должен установить тип параметра в REAL в моем XML-файле, чтобы это работало, и теперь у меня возникают проблемы с методом cellForRowAtIndexPath для установки моих значений в ячейку. Есть ли способ преобразовать отсортированный массив (с реальным значением в нем) обратно в массив только со строковыми значениями. Проблема в том, что я не получаю ошибок, но только приложение останавливается перед отображением табличного представления. Я немного поиграл с чем-то, и я получаю сообщение об ошибке -[Длина UIImage]: нераспознанный селектор, отправленный в экземпляр. Может ли кто-нибудь дать мне дополнительную помощь в этом? Спасибо!

5. Получите значение NSNumber из словаря, преобразуйте его в число с плавающей запятой с помощью: - (float)floatValue и форматируйте по желанию с (id)stringWithFormat:(NSString *)format, ... помощью . Или преобразуйте значение NSNumber непосредственно в NSString с - (NSString *)stringValue помощью, но вы получите форматирование по умолчанию, и это может быть не то, что вы хотите.

Ответ №2:

 // assume toBeSorted is your array of dictionaries and the key for the int values is @"myInt"
NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"myInt" ascending:YES] autorelease];
[toBeSorted sortUsingDescriptors:[NSArray arrayWithObject:sort]];
 

Это приближает вас к нужному месту.
Если вы всегда используете неотрицательные числа, вы можете затем проверить, представляет ли первый объект ваше значение 0, и переместить его в конец массива.

Комментарии:

1. Я предполагаю, что запятая в числах является десятичной точкой в соответствии с некоторыми локализациями, поэтому в вопросе действительно всего 3 значения.

2. Прохладный. Если это так, этот ответ должен отсортировать эти числа «(например, 12,0; 1,2; 6,4).» по желанию

3. По желанию: 1,2 6,4 12,0. Вот мое предположение, это расстояния в километрах (км), и сортировка желательна по расстоянию. в локализации США: 1.2km, 6.4km, 12.0km.

4. Хорошо, я попытаюсь привести вам более простой пример. Предположим, что у меня внутри следующие числа: 1, 2, 10 и 102. Я получу следующую сортировку: 1, 10, 102, 20! Это то, что я назвал СТРОКОВОЙ сортировкой. Что мне нужно, так это числовая сортировка чисел, которые я получаю 1, 2, 20, 102.

5. Можете ли вы попробовать это, заполнив свой массив другим ключом, который является объектом NSNumber, и отсортировав по этому ключу?