插入后NSMutableDictionary重新排序元素

时间:2012-04-20 09:04:53

标签: iphone objective-c ios nsdictionary xmppframework

  

可能重复:
  NSDictionary with ordered keys

我正在使用XMPPFramework for iOS,我非常惊讶地发现每次插入新的占用者/元素时,包含房间占用者的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];

我需要按插入顺序存储元素。我还需要通过字符串访问元素。 有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

NSDictionary不准备包含任何订单,准备包含成对的key-object,如果你想保留订单,你需要一个不同的解决方案,比如NSArray。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您不应该担心NSDictionary存储键的顺序,因为它是一张没有订单的地图。您真正关心检索值的顺序,因此您必须对键进行排序并按排序顺序访问值。

以下是按字母顺序排序键并按顺序检索值的示例:

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