0

如何控制字典或 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]];
4

2 回答 2

1

字典是明确且必然是无序的。

如果您想要特定的顺序,则必须使用支持对其内容进行排序的容器,例如数组。

您可能想要做的是将 plist 中的外部容器更改为数组,去掉索引字段,并将其替换为 name 或 id 字段,其中包含现在的字典键。

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

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


至于通过索引字段访问对象:

这一点有点晦涩,但很简单:

一种选择是:

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

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

于 2013-04-27T11:35:21.057 回答
0

Here is a simplified example of using sortedArrayUsingComparator for reference.

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);
    }
于 2013-04-29T08:24:14.397 回答