2012-04-20 3 views
1

Можно создать дубликат:
NSDictionary with ordered keysNSMutableDictionary элементов переупорядочения после вставки

Im используя XMPPFramework для прошивки, и Im довольно удивлён Seing что NSDictionary содержащих обитателей комнаты изменяет порядок его содержимое каждый раз, когда вставлен новый пользователь/элемент.

Вот выход, после каждой вставки.

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 2,entries => 
1 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360> 
2 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} =  <XMPPRoomOccupant: 0xbca7cc0> 
} 

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 3,entries => 
0 : <CFString 0xbe60710 [0x1f02400]>{contents = "4ee8fca3e4b08c62894a6489"} = <XMPPRoomOccupant: 0xbe61370> 
1 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360> 
2 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} = <XMPPRoomOccupant: 0xbca7cc0> 
} 

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 4,entries => 
0 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} = <XMPPRoomOccupant: 0xbca7cc0> 
4 : <CFString 0xbe71eb0 [0x1f02400]>{contents = "4f7ade44e4b09cb64dc33b90"} = <XMPPRoomOccupant: 0xbe72950> 
5 : <CFString 0xbe60710 [0x1f02400]>{contents = "4ee8fca3e4b08c62894a6489"} = <XMPPRoomOccupant: 0xbe61370> 
6 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360> 
} 

Как вы можете видеть в этом последнем вставке, он изменил порядок на 2 элемента, и он изменил свой индекс. Это нормально? Я посмотрел на код и его вставки с помощью:

[Оккупанты SetObject: жилец forKey: aNickName];

Мне нужны элементы для хранения в том порядке, в котором он был вставлен. И мне также нужно получить доступ к элементу через строку. Любая идея?

Благодаря

ответ

1

NSDictionary не готов содержать любой заказ, подготавливается для размещения пар ключ-объекта, если вы хотите сохранить заказ, вам нужно другое решение, как в NSArray для него.

Возможно, вам нужно задуматься о своей реализации!

0

Я думаю, что NSDictionary не помнит, как были вставлены пары ключ-значение. Вы можете сортировать ключи или значения чем-то вроде sortedArrayUsingSelector:, но если порядок важен, вместо него следует использовать NSArray.

0

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

Вот пример сортировки ключей в алфавитном порядке, и извлечения значений в следующем порядке:

NSArray *sortedKeys =[[dict allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
for (NSString *key in sortedKeys) 
{ 
    NSString *value = [dict objectWithKey:key]; 
} 
+0

Дело в том, что каждый раз, когда элемент вставлен ли я использовать словарь для печати данных, поэтому, так как порядок меняется уже напечатанные данные не имеют смысла ... – subharb

+0

@DavidShaikh Похоже, вы хотите определить порядок печатных данных, поэтому вам нужно отсортировать ключи, как описано. – trojanfoe

+0

Но порядок, который мне нужно сохранить, - это то, как он был вставлен, а не в алфавитном порядке, который, как мне кажется, поддерживает . Первый элемент вставлен, и я печатаю первый элемент. Другой элемент вставлен, и я печатаю второй, но с изменением порядка, и Im фактически печатает первый элемент во второй раз. – subharb

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