2013-04-27 46 views
0

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

我有一个plist 65项。每个项目是一个包含三个项目的词典,一个数字(索引)以及两个图像名称的字符串。 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]]; 

回答

1

词典是明确和必然无序。

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

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

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

(通常情况下,寿”,如果你遍历的东西,这东西应该会是一个数组,而不是一本字典,虽然这不是一个硬性的规则。)


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

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

一种选择是这样的:

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

这假定结果数组是密集的;即所有指标都存在,没有差距。

+0

谢谢,是的,我明白了。我想我可以很容易地弄清楚如何实现你的第一个建议,这很好,但我试图弄清楚如何使用每个子字典项目的索引项来确定顺序。有没有简单的方法来解释?看到我的问题底部我正在使用的代码,但显然不工作。 – Mrwolfy 2013-04-27 11:43:27

+0

@Mrwolfy:查看更新。 – 2013-04-27 11:56:22

+0

sortedArrayUsingComparator – Mrwolfy 2013-04-27 12:15:59

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); 
    }