1

可能重复:
带有有序键的 NSDictionary

我在 iOS 上使用 XMPPFramework,当每次插入新的占用者/元素时,包含房间占用者的 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:occupant forKey:aNickName];

我需要按照插入的顺序存储元素。而且我还需要通过字符串访问元素。任何想法?

谢谢

4

3 回答 3

1

NSDictionary 不准备包含任何顺序,而是准备包含键对象对,如果要保留顺序,则需要不同的解决方案,例如 NSArray 。

也许您需要重新考虑您的实施!

于 2012-04-20T09:11:02.057 回答
0

我认为 NSDictionary 不记得键值对是如何插入的。您可以通过类似的方式对键或值进行排序sortedArrayUsingSelector:,但如果顺序很重要,则应使用 NSArray 代替。

于 2012-04-20T09:11:27.987 回答
0

您不必担心密钥在 中的存储顺序,因为NSDictionary是一个没有顺序的映射。您确实关心检索值的顺序,因此您必须对键进行排序并按排序顺序访问值。

这是按字母顺序对键进行排序并按顺序检索值的示例:

NSArray *sortedKeys =[[dict allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys)
{
    NSString *value = [dict objectWithKey:key];
}
于 2012-04-20T09:12:05.997 回答