2015-06-24 4 views
1

Я новичок в разработке IOS, и я в проблеме, что я не знаю, как ее решить ...IOS цель словаря сортировать по количеству

У меня есть JSON:

{ 
    "038b7af5-2874-448b-88c3-f667908723d8" = { 
     Name = "Coffee"; 
     Quantity = 5; 
    }; 
    "4d63daaf-962b-4382-a90e-dd4db0ce052e" = { 
     Name = "Water"; 
     Quantity = 1; 
    }; 
    "693a6897-4250-4eef-8164-3bb1812315fc" = { 
     Name = "Fruit frappe"; 
     Quantity = 1; 
    }; 
    "778a66df-a2ec-419f-b9dc-94e0c0fef40d" = { 
     Name = "Fruit nes frappe"; 
     Quantity = 1; 
    }; 
} 

Что я хочу сделать, так это отсортировать их по номеру UITableViewController по количеству. Я пробовал NSSortDescriptor, но без успеха ... Заранее благодарен, Stefan

+0

Вы должны были отсортировать это на стороне сервера. – 0yeoj

+0

Да, я это знаю. Но у меня пока нет сервера, поэтому я тестирую его локально ... – Stefan

+1

@ 0yeoj: Как вы предлагаете отправить отсортированный словарь JSON? И если в приложении есть кнопка «Сортировка», которая позволяет сортировать по имени, как вы предлагаете отправлять словарь JSON, отсортированный по количеству, и сортировать по имени в одно и то же время? – gnasher729

ответ

3

Словари - это неупорядоченные типы коллекций.

Чтобы заказать табличное представление, вам необходимо использовать дополнительный массив (который можно заказать) ключей словаря.

Чтобы заполнить пункт 0 таблицы, вы получите ключ из массива по индексу 0, а затем получите значения столбца из словаря с этим ключом.

Чтобы отсортировать этот массив по Quanitity вы это делаете:

@property (readonly) NSMutableArray *arrayIndex; 
@property (readonly) NSMutableDictionary *dataDict; 

...

[arrayIndex sortUsingComparator:^NSComparisonResult(NSString *keyA, NSString *keyB) { 
    NSDictionary *dictA = _dataDict[keyA]; 
    NSNumber *quantityA = dictA["Quantity"]; 
    NSDictionary *dictB = _dataDict[keyB]; 
    NSNumber *quantityB = dictB["Quantity"]; 
    if (quantityA.integerValue > quantityB.integerValue) 
     return NSOrderedDescending; 
    else if (quantityA.integerValue < quantityB.integerValue) 
     return NSOrderedAscending; 
    return NSOrderedSame; 
}]; 

Бесплатный совет: Не хранить данные в словарях, если вы можете избежать этого; вместо этого конвертируйте словарь в пользовательский объект как можно скорее, так как пользовательские объекты приносят столько энергии и гибкости вашему коду, и посмотрите, сколько кода мне пришлось писать, чтобы сделать компаратор.

+1

Хороший ответ. Просто отметим, что это можно было бы еще более упростить, воспользовавшись «сравнением:» (вместо ручного сравнения); хотя я предполагаю, что расширенная форма хороша по педагогическим причинам. – Alladinian

+0

@ Alladinian Действительно. Я хочу поощрять пользовательские объекты, а не словари словарей, так что чем хуже это выглядит, тем лучше: D – Droppy

+0

: P Согласовано, но опыт говорит, что люди часто не обескуражены этим: / – Alladinian

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