如何在不更改顺序的情况下将NSArray插入NSDictionary

时间:2010-12-02 14:42:11

标签: iphone objective-c

我面临将数据插入字典的问题。 它没有按照我给它的顺序保存数据。 对于这个字典,我给出了一个键数组和一个像这样的值数组。

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"}
}

我想按所需顺序存储数据。这是我的主要关注点。

6 个答案:

答案 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等。