Перебирая словарь; почему я не получаю ключи по алфавиту? - PullRequest
2 голосов
/ 14 июня 2011

Я пишу приложение для iPhone, используя S7Graphview, и я сохранил некоторые даты и результаты в .plist в качестве ключей и значений в словаре, как строки. Мой plist выглядит так:

<dict>
<key>2011-05-11</key>
<string>23</string>
<key>2011-05-12</key>
<string>23</string>
<key>2011-05-13</key>
<string>23</string>
<key>2011-05-14</key>
<string>43</string>
<key>2011-06-14</key>
<string>43</string>
</dict>

Затем я использую этот цикл для загрузки этих значений в графическое представление:

NSMutableDictionary* dictionary = [[NSMutableDictionary alloc]init];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
int i = 1;        

if ([dictionary count] > 0) {
for (NSString* key in dictionary){
    NSString* verdiString = [dictionary objectForKey:key];
    CGFloat verdi = [verdiString intValue];
    NSDate *dato = [[NSDate alloc]init];
    NSLog(@"key=%@ value=%@", key, [dictionary objectForKey:key]);
    dato = [self stringTilDato:key];
    [items.list_ addObject:[[GraphInfo alloc] initWithID:i name:verdiString value:verdi date:dato]];
    i++;
}
}

Метод stringTilDato преобразует строку даты в NSDate. Значения загружаются в items.list, но в неправильном порядке! NSLog сообщает:

key=2011-05-14 value=43
key=2011-05-13 value=23
key=2011-05-12 value=23
key=2011-06-14 value=43
key=2011-05-11 value=23
key=2011-05-14 value=43
key=2011-05-13 value=23
key=2011-05-12 value=23
key=2011-06-14 value=43
key=2011-05-11 value=23

(Не знаю, почему он проходит через ключи дважды, кстати, но я не верю, что это важно). Я думал, что ключи будут читаться в алфавитном порядке, или, по крайней мере, в порядке списка. Почему plist загружается в словарь в таком порядке или проблема заключается в моем цикле загрузки?

Надеюсь, есть кто-то, кто может мне помочь:)

Ответы [ 3 ]

7 голосов
/ 14 июня 2011

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

4 голосов
/ 14 июня 2011

Документация для NSDictionary говорит конкретно:

Порядок элементов в массиве не определено.

Однако, если вы хотите, чтобы ключи были отсортированы в определенном порядке, есть как минимум три метода, которые возвращают отсортированный массив ключей. Посмотрите на справочной странице NSDictionary методы, начинающиеся с "keysSortedBy ..."

2 голосов
/ 14 июня 2011

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

...