我面临将数据插入字典的问题。 它没有按照我给它的顺序保存数据。 对于这个字典,我给出了一个键数组和一个像这样的值数组。
arrItemDetails和arrItemNames都是NSMutableArray实例
NSArray *detailsArray = [NSArray arrayWithArray:arrItemDetails];
NSArray *namesArray = [NSArray arrayWithArray:arrItemNames];
NSDictionary *dictWithItemNamesAndDetails = [NSDictionary dictionaryWithObjects:arrItemDetails forKeys:arrItemNames];
但对于我的应用程序,我需要维护订单,所以请帮我解决这个问题。
我给出了namesArray(keys)和detailsArray(valuesarray)的输出,并在添加它们之后字典也是kk
打印arrItemDetails的说明:
(
hi,
44,
5,
555,
3
)
打印arrItemNames的说明:
(
CardName,
AccessNumber,
AccessPause,
Pin,
Pause
)
打印dictWithItemNamesAndDetails的描述:
<CFBasicHash 0x6a90680 [0x274b380]>{type = immutable dict, count = 5,
entries =>
0 : <CFString 0xe3b4 [0x274b380]>{contents = "AccessNumber"} = <CFString 0x6d25970 [0x274b380]>{contents = "44"}
1 : <CFString 0xe394 [0x274b380]>{contents = "Pin"} = <CFString 0x6d3cda0 [0x274b380]>{contents = "555"}
3 : <CFString 0xe384 [0x274b380]>{contents = "Pause"} = <CFString 0x6d37080 [0x274b380]>{contents = "3"}
5 : <CFString 0xe3a4 [0x274b380]>{contents = "AccessPause"} = <CFString 0x6d6c250 [0x274b380]>{contents = "5"}
6 : <CFString 0xe3c4 [0x274b380]>{contents = "CardName"} = <CFString 0x6d56c70 [0x274b380]>{contents = "hi"}
}
我想按所需顺序存储数据。这是我的主要关注点。
答案 0 :(得分:4)
字典不是有序/索引的数据结构。它是一个键/值配对数据结构。您无法保证钥匙的顺序。插入新密钥/值后,之前的订单可能会发生变化。如果要使用字典,则需要使用键来访问值,而不是任何类型的索引。
答案 1 :(得分:2)
如果订单对您很重要,您需要的是一系列字典(带有'name'和'detail'键),而不是字典。
答案 2 :(得分:1)
无法以特定顺序在NSDictionary中插入内容。检索内容数组的两个选项(allValues和allKeys)都在documentation中注明:
未定义数组中元素的顺序
答案 3 :(得分:1)
如@taskinoor所述,字典不是有序数据结构。实际上,它应该与您的程序无关,这些值存储在字典中的顺序。如果您在从字典中检索值时关心顺序,请自行对allKeys
数组进行排序,或使用其中一种排序方法(如keysSortedByValueUsingComparator:
)获取按值排序的键数组
答案 4 :(得分:1)
NSDictionary
是一个无序集合。如果您需要订购,您可以使用@ smorgan的建议,或者尝试实施您自己的OrderedDictionary
课程以满足您的需求。 Matt Gallagher有一个关于该主题的简明指南:http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html。
答案 5 :(得分:0)
仍然不确定为什么订单很重要,但我认为你唯一的选择是在你使用它们时重新排序。也就是说,如果它们是NSMutableArrays,那么当您引用它们时,您可以“手动”将AccessNumber移动到位置0等。