如何控制从plist项创建的字典的迭代顺序?

时间:2013-04-27 11:30:59

标签: objective-c dictionary plist nsdictionary

如何控制字典或plist中的项目的迭代顺序?

我有一个有65个项目的plist。每个项目都是一个包含三个项目的字典,一个数字(索引)和两个作为图像名称的字符串。 plist看起来像这样:

<key>Item 1</key>
<dict>
    <key>index</key>
    <integer>0</integer>
    <key>thumb</key>
    <string>001_item01.png</string>
    <key>pdf</key>
    <string>001_item01</string>
</dict>
<key>Item 2</key>
<dict>
    <key>index</key>
    <integer>1</integer>
    <key>thumb</key>
    <string>002_item02.png</string>
    <key>pdf</key>
    <string>002_item02</string>
</dict>

依旧......

我可以从plist构建一个字典,如下所示,但我还没弄清楚如何确定顺序。我需要根据项目编号或索引按顺序拉出每个项目。

NSDictionary * myDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Items" ofType:@"plist"]];

事实上,当我迭代时,顺序似乎是随机的:

for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);


2013-04-27 18:12:52.576 dicTest[47865:c07] 007_item07.png
2013-04-27 18:12:52.577 dicTest[47865:c07] 052_item52.png
2013-04-27 18:12:52.577 dicTest[47865:c07] 045_item45.png
2013-04-27 18:12:52.577 dicTest[47865:c07] 038_item38.png
2013-04-27 18:12:52.578 dicTest[47865:c07] 010_item10.png
2013-04-27 18:12:52.578 dicTest[47865:c07] 008_item08.png
2013-04-27 18:12:52.578 dicTest[47865:c07] 046_item46.png
2013-04-27 18:12:52.579 dicTest[47865:c07] 009_item09.png

尝试根据索引按顺序获取项目(词典):

    NSDictionary * dictionary = [myDict objectForKey:[myDict.allKeys objectAtIndex:i]];

2 个答案:

答案 0 :(得分:1)

词典明确且必然无序。

如果您需要特定订单,则必须使用支持其内容排序的容器,例如数组。

您可能想要做的是将plist中的外部容器更改为数组,删除索引字段,并将其替换为名称或id字段,其中包含现在字典的键。< / p>

或者,您可以按原样保留文件,并创建一个辅助数组,以允许按索引访问元素,而不是按键访问。

(通常,如果你正在迭代某些东西,那么某些东西应该是一个数组,而不是字典,尽管这不是一个很难的规则。)


至于按索引字段访问对象:

这个位有点模糊,但很容易做到:

一种选择是:

NSArray *myIndex = [[myDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2) {
  return [[obj1 valueForKey:@"index"] compare:[obj2 valueForKey:@"index"]];
}];

这假设得到的数组是密集的;即所有索引都存在,没有间隙。

答案 1 :(得分:0)

以下是使用sortedArrayUsingComparator作为参考的简化示例。

NSArray *someArray = [NSArray arrayWithObjects:@1,@3,@6,@8,@5,@2,@4,@7, nil];
NSArray *sortedArray = [someArray sortedArrayUsingComparator:^(id obj1, id obj2) {
    return [obj1 compare:obj2];
}];

//log the sorted array
    for (NSNumber *num in sortedArray) {
        NSLog(@"%@", num);
    }