2013-04-27 3 views
0

Как управлять порядком для итерации словаря или предметов из plist?Как управлять порядком для итерации словаря, созданного из элементов plist?

У меня есть plist с 65 элементами. Каждый элемент представляет собой словарь с тремя элементами, число (индекс) и две строки, которые являются именами изображений. PLIST выглядит следующим образом:

<key>Item 1</key> 
<dict> 
    <key>index</key> 
    <integer>0</integer> 
    <key>thumb</key> 
    <string>001_item01.png</string> 
    <key>pdf</key> 
    <string>001_item01</string> 
</dict> 
<key>Item 2</key> 
<dict> 
    <key>index</key> 
    <integer>1</integer> 
    <key>thumb</key> 
    <string>002_item02.png</string> 
    <key>pdf</key> 
    <string>002_item02</string> 
</dict> 

и так далее ...

Я могу построить словарь из списка свойств, как показано ниже, но я не понял, как определить порядок. Мне нужно вытащить каждый элемент в порядке в соответствии с номером позиции или индексом.

NSDictionary * myDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Items" ofType:@"plist"]]; 

В самом деле, когда я итерацию, порядок является случайным, казалось бы:

for(id key in myDict) 
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]); 


2013-04-27 18:12:52.576 dicTest[47865:c07] 007_item07.png 
2013-04-27 18:12:52.577 dicTest[47865:c07] 052_item52.png 
2013-04-27 18:12:52.577 dicTest[47865:c07] 045_item45.png 
2013-04-27 18:12:52.577 dicTest[47865:c07] 038_item38.png 
2013-04-27 18:12:52.578 dicTest[47865:c07] 010_item10.png 
2013-04-27 18:12:52.578 dicTest[47865:c07] 008_item08.png 
2013-04-27 18:12:52.578 dicTest[47865:c07] 046_item46.png 
2013-04-27 18:12:52.579 dicTest[47865:c07] 009_item09.png 

пытается захватить предметы (словари) в порядке, основанном на индексе:

NSDictionary * dictionary = [myDict objectForKey:[myDict.allKeys objectAtIndex:i]]; 

ответ

1

словари явно и обязательно неупорядочен.

Если вам нужен конкретный заказ, вы должны использовать контейнер, который поддерживает порядок его содержимого, например массив.

Что вы, скорее всего, захотите сделать, это изменить внешний контейнер в вашем plist на массив, избавиться от поля индекса и заменить его на имя или поле id, содержащее то, что теперь является ключом словаря.

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

(Обычно, помысел, если вы итерацию над чем-то, что-то должно вероятно быть массивом, а не словарь, хотя это не жесткое правило.)


Что касается доступа объект их указательным поле:

Этот бит является немного неясным, но достаточно просто сделать:

Один из вариантов заключается в следующем:

NSArray *myIndex = [[myDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2) { 
    return [[obj1 valueForKey:@"index"] compare:[obj2 valueForKey:@"index"]]; 
}]; 

Это предполагает, что результирующий массив будет плотным; то есть все индексы присутствуют без пробелов.

+0

Спасибо, да, я понял. Я думаю, что я могу легко понять, как реализовать свое первое предложение, что хорошо, но я пытался выяснить, как использовать элемент индекса для каждого элемента подглавного слова для определения порядка. Есть ли простой способ объяснить это? Посмотрите на мою часть вопроса о коде, который я использую, но, похоже, не работает. – Mrwolfy

+0

@Mrwolfy: Смотрите обновление. –

+0

sortedArrayUsingComparator – Mrwolfy

0

Ниже приведен упрощенный пример использования sortedArrayUsingComparator для справки.

NSArray *someArray = [NSArray arrayWithObjects:@1,@3,@6,@8,@5,@2,@4,@7, nil]; 
NSArray *sortedArray = [someArray sortedArrayUsingComparator:^(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 

//log the sorted array 
    for (NSNumber *num in sortedArray) { 
     NSLog(@"%@", num); 
    } 
Смежные вопросы