2013-04-06 2 views
2

Смущает !!!Сортировка NSMutableDictionary

У меня есть один NSMutableDictionary под названием tempDict, имеющий ключигрузов, топлива, скидка (и многое другое) с соответствующими значениями .

Я генерируя две разные NSMutableArrays называется arrTVBuyCharge и arrTVBuyCost от tempDict используя этот код:

[arrTVBuyCharge addObjectsFromArray:[(NSArray *)[tempDict allKeys]]]; 
[arrTVBuyCost addObjectsFromArray:[(NSArray *)[tempDict allValues]]]; 

Проблема: Я хочу грузов, топлива и дисконтные на вершине в указанных массивах в том порядке, (Ofcourse, с порядком Значения).

Что такое оптимальный способ достижения этого?

ответ

1

1) Получить три объекта отдельно:

NSArray *mainKeys = @[@"Freight", @"Fuel", @"Discount"]; 
NSArray *mainValues = @[[tempDict valueForKey:@"Freight"], 
     [tempDict valueForKey:@"Fuel"], 
     [tempDict valueForKey:@"Discount"] 
     ]; 
[arrTVBuyCharge addObjectsFromArray:mainKeys]; 
[arrTVBuyCost addObjectsFromArray:mainValues]; 

2) Удалите их tempDict:

[tempDict removeObjectsForKeys:mainKeys]; 

3) Добавить объекты из обновленного tempDict:

[arrTVBuyCharge addObjectsFromArray:(NSArray *)[tempDict allKeys]]; 
[arrTVBuyCost addObjectsFromArray:(NSArray *)[tempDict allValues]]; 

Это сделает Фрахт, топливо и Скидка быть в индексе 0, 1 и 2 в ваших новых массивах.

+0

Я поеду с вашим ответом, поскольку он лучше всего подходит для ситуации в Моем кодексе. Я отредактировал ваш ответ, чтобы устранить Crashes. – Bhavin

+0

Рад помочь :) –

1

Человек, NSMutableDictionary всегда возвращает ключи неупорядоченным способом, если вы действительно хотите сохранить заказ, то вы можете сортировать его в алфавитном порядке или вы можете добавить серийные номера 01, 02, 03 перед вашими значениями, чтобы отсортировать их в чтобы они были поставлены, затем обрезать первые два символа строки и использовать ее.

+0

Да ладно, я знаю, что «NSMutableDictionary всегда возвращает ключи беспорядочно». Вот почему я задаю вопрос. Я знаю, что не могу сортировать NSMutableDictionary. Так что лучший способ его решить? – Bhavin

+0

Да, я сказал, что вы можете добавлять серийные номера или что-то, пока вы заполняете массив, а затем сортируете их, используя [anArray sortedArrayUsingSelector: @selector (localizedCaseInsensitiveCompare :)). У меня была аналогичная проблема, поэтому я сделал то же самое. Я добавил значение 01.the, значение 02.the в свои массивы, а затем отсортировал его. Когда я хотел использовать содержимое массива, я взял subsStringFromIndex: 3 – satheeshwaran

+0

Я рассматриваю ваше решение. – Bhavin

3

Сначала кажется сложным, но это просто, когда вы думаете об этом. Все, что вы хотите сделать, это получить отсортированный список ключей и посмотреть значение для каждого ключа, когда вы добавляете их в свои массивы.

Чтобы получить массив со списком отсортированных ключей:

NSArray *sortedKeys = [[tempDict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

Тогда итерацию через те и добавить их к NSMutableArrays:

NSMutableArray *arrTVBuyCharge = [[NSMutableArray alloc] init]; 
NSMutableArray *arrTVBuyCost = [[NSMutableArray alloc] init]; 
for (NSString *key in sortedKeys) { 
    [arrTVBuyCharge addObject:key]; 
    [arrTVBuyCost addObject:[tempDict objectForKey:key]]; 
} 

Для еще большей производительности используйте метод initWithCapacity для NSMutableArrays, так как вы знаете размер.

Это стандартный способ сделать это.

+1

_ + 1_ Это определенно способ сделать это. Если вам нужны отсортированные значения, используйте '-keysSortedByValueUsingSelector:'. – Tricertops

+0

Спасибо, Маркус. Я просто хочу знать, как ваше решение лучше, чем ответ Сатишварвана. В его ответе нет петель. – Bhavin

+0

@iMartin - это порядок, в котором вы добавляете значения, которые будут одинаковыми по порядку, которые вы хотите отсортировать, которые вам понадобятся для решения satheshwaran? Если это так, то просто используйте массив, а не словарь. Я не изобрел это решение. Вы найдете его почти в каждом учебнике по NSDictionary. Это стандартный способ. Это просто. Вам не нужен цикл for, зависит от того, что вы делаете с данными. –

Смежные вопросы