расположение объектов в NSMutableDictionary - PullRequest
0 голосов
/ 03 января 2012

вот мой словарь и его значения

NSMutableDictionary *myDic=[NSMutableDictionary Dictionary];
[myDIC setObject:@""];

[myDIC  setObject:string1 forKey:key1];
[myDIC  setObject:string2 forKey:key2];
[myDIC  setObject:string3 forKey:key3];

так что до сих пор я заполнил свой словарь. Теперь я хочу прочитать их через цикл for.

for (NSString *key in myDic ){


}

вот моя проблема!в этом цикле мой первый ключ будет key1 , но, кажется, он начинается с последнего ключа, который я установил ранее!

есть кто-нибудь, кто может сказать мне, почему?и как я могу оправдать мои ожидания, как я объяснил?

Ответы [ 2 ]

2 голосов
/ 03 января 2012

NSDictionary не является базой индексов, это Hashtable, и, как и все HashTable, элементы хранятся в соответствии с некоторой логической базой в некотором Hash, который вы не знаете. Если вы заглянете в документацию по NSDictionary, вы найдете предложение, в котором говорится, что нет гарантии относительно порядка, в котором элемент будет извлечен.
Если вы хотите, чтобы ваш ключ получался в определенном порядке, вам нужно будет хранить ключи в NSArray в том порядке, в котором вы их хотите.


Или вы можете сортировать ключи, когда они вам нужны.

NSArray * allKeys = [myDict allKeys];
allKeys = [allKeys sortedArrayUsing//  [see the documentation for all options][1] ]; 
1 голос
/ 03 января 2012

Я сталкивался с этой проблемой раньше. Порядок конкретного элемента в NSArray NSMutableArray определяется его индексом.

Но в отличие от NSArray или NSMutableArray, порядок элементов в NSMutableDictionary или NSDictionary не определен, и никто не знает, потому что его механизм. Я выбрал для вас абзац из Mac OS X Developer Libary:

"Внутри словарь использует хеш-таблицу для организации своего хранилища и обеспечить быстрый доступ к значению, заданному соответствующим ключом. Однако методы, определенные для словарей, изолируют вас от сложности работы с хеш-таблицами, хеш-функциями или хеширует значение ключей. Методы берут ключи напрямую, а не в своих хешированная форма. "

...