С быстрым перечислением и NSDictionary, итерация в порядке ключей не гарантируется - как я могу сделать так, чтобы она была в порядке?
Я общаюсь с API, который отправляет NSDictionary в качестве ответа с данными, которые нужны моему приложению (данные в основном являются фидом). Эти данные сортируются от самых старых до самых старых, с новейшими элементами в начале NSDictionary.
Когда я быстро перечисляю их с помощью for (NSString *key in articles) { ... }
, порядок кажется случайным, и, следовательно, порядок, который я им нахожу, не в порядке от самого нового до самого старого, как я хочу, но полностью случайного.
Я прочитал, и при использовании быстрого перечисления с NSDictionary не гарантируется итерация по порядку через массив.
Однако мне это нужно. Как заставить его перебирать NSDictionary в порядке, в котором находится NSDictionary?
Ответы
Ответ 1
Один способ может состоять в том, чтобы получить все ключи в изменяемом массиве:
NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];
И затем отсортируйте массив в соответствии с вашими потребностями:
[allKeys sortUsingComparator: ....,]; //or another sorting method
Затем вы можете перебирать массив (используя, как мне кажется, быстрое перечисление здесь порядок), и получить значения словаря для текущего ключа:
for (NSString *key in allKeys) {
id object = [dictionary objectForKey: key];
//do your thing with the object
}
Ответ 2
Словари по определению неупорядочены. Если вы хотите применить заказ к ключам, вам необходимо отсортировать ключи.
NSArray *keys = [articles allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys) {
// process key
}
Обновите способ сортировки ключей в соответствии с вашими потребностями.
Ответ 3
Вы также можете прямо перечислять так:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
for (NSString* key in xyz) {
id value = [xyz objectForKey:key];
// do stuff
}
Это взято из ответа, предоставленного zneak в вопросе: для каждого цикла в объекте c для доступа к NSMutable dictionary
Ответ 4
Как говорили другие люди, вы не можете гарантировать порядок в NSDictionary. И иногда, заказывая свойство allKeys, это не то, что вы действительно хотите. Если то, что вы действительно хотите, это перечислить ваш dict по порядку, в котором ваши ключи были вставлены в ваш dict, вы можете создать новое свойство/переменную NSMutableArray для хранения ваших ключей, чтобы они сохранили свой порядок.
Каждый раз, когда вы вставляете новый ключ в dict, вставьте его в свой массив:
[articles addObject:someArticle forKey:@"article1"];
[self.keys addObject:@"article1"];
Чтобы перечислить их по порядку, просто выполните:
for (NSString *key in self.keys) {
id object = articles[key];
}