如何控制字典或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]];
答案 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);
}