插入后的NSMutableDictionary重新排序元素[重复]

Posted

技术标签:

【中文标题】插入后的NSMutableDictionary重新排序元素[重复]【英文标题】:NSMutableDictionary reordering elements after insert [duplicate] 【发布时间】:2012-04-20 09:04:53 【问题描述】:

可能重复:NSDictionary with ordered keys

我正在为 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];

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

    NSString *value = [dict objectWithKey:key];

【讨论】:

问题是每次插入一个元素时我都使用字典来打印数据,所以由于顺序改变了已经打印的数据没有意义...... @DavidShaikh 听起来好像要定义打印数据的顺序,所以需要按照描述对键进行排序。 但是我需要保持的顺序是它是如何插入的,而不是按字母顺序,我认为这是保持插入第一个元素的顺序,然后我打印第一个元素。插入了另一个元素,我打印了第二个元素,但是哎呀顺序已经改变,我实际上是第二次打印第一个元素。 @DavidShaikh 好的,那么你需要保留一个单独的NSArray,它只保存键,按照它们插入的顺序,这可以作为上面的sortedKeys @DavidShaikh 你可以写一个类来封装NSArrayNSDictionary 并且具有与NSDictionary 相同的接口;一旦完成,你甚至不会知道它不是NSDictionary

以上是关于插入后的NSMutableDictionary重新排序元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSMutableDictionary中UIImage的存储和读取

使用指向链接列表的指针存储 NSMutableDictionary 一个 C 结构

NSMutableArray 未更新且 UITableView 未重新加载

如何阻止指针更新前一个循环中的数据?

将 NSMutableDictionary 的键/值存储到另一个 NSMutableDictionary

两个NSMutableDictionary合并成一个NSMutableDictionary