#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, и отсортировав по этому ключу?