2012-06-19 2 views
1

У меня есть два массива.Фильтрация NSArray из NSDictionaries из значений в другом NSArray с сохранением порядка

Первый массив - это просто список названий стран в очень определенном порядке.

countryNames = ["Canada", "USA", "Mexico"]; 

Второй массив - это коллекция объектов страны.

countries = [ {name: "USA", foo: "bar"}, {name: "Italy", foo: "bar"}, {name: "Canada", foo: "bar"}, {name: "Mexico", foo: "bar"} ] 

мне нужно фильтровать countries используя countryNames массив, сохраняя при этом порядок countryNames.

Моя первая попытка фильтруется правильно, но не сохраняет порядок:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name in %@", countryNames]; 
NSArray *filteredCountries = [countries filteredArrayUsingPredicate:predicate]; 

Я думаю, что происходит это порядок стран сохраняется, минус те, которые не нашли в countryNames.

Любые идеи?

ответ

0

Я пытался избежать этого, но до сих пор это единственный способ я знаю, как:

NSMutableArray *filteredCountries = [[[NSMutableArray alloc] init] autorelease]; 
NSArray *countryNames = ... // list of country names. this order matters 
NSArray *countries = ... // array of country objects 
for (NSString *name in countryNames) { 
    for (NSDictionary *dict in countries) { 
     if ([[dict objectForKey:@"name"] isEqualToString:name]) { 
      [filteredCountries addObject:dict]; 
     } 
    } 
} 

Это отстой, но он поставляется. Все еще приветствуя лучшее, более элегантное решение.

+0

http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html – vikingosegundo

0

страны должны оставаться в том порядке, в котором были найдены предметы. Простейшей задачей было бы переупорядочить страны надлежащим порядком, затем отфильтровать их или просто отсортировать их после того, как ваш предикат будет их фильтровать. Можно также добавить поле заказа в страны, а затем использовать sortedArrayUsingSelector:

Смотрите документы здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Arrays.html#//apple_ref/doc/uid/20000132-SW5

+0

Оба этих объекта возвращаются из запроса веб-службы, и у клиента не будет никакого способа узнать, как сортировать «страны». Сервер сортирует 'countryNames'' created_at', поэтому он должен отвечать за определение порядка. – djibouti33

+0

Ладно, так что, может быть, я точно не понимаю. Есть ли страны в правильном порядке, но countryNames нет? Должны ли они быть в этом порядке «США», «Италия», «Канада» или «Канада», «США», «Мексика»? Другими словами, какой результат вы хотели бы получить от Предиката? –

+0

Я только забочусь о порядке 'countryNames'. Результатом предиката должен быть [{Канада}, {США}, {Мексика}]. – djibouti33

0

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

Спасибо.

+0

Это именно то, что я делаю. 'countryNames' - это мой массив ключей в определенном порядке. Используя эти ключи, мне нужно захватить конкретный словарь из «стран», имя которого совпадает с ключом из «countryNames». – djibouti33

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