【问题标题】:How do I control the order for iteration of a dictionary created from plist items?如何控制从 plist 项创建的字典的迭代顺序?
【发布时间】:2013-04-27 11:30:59
【问题描述】:

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

【问题讨论】:

    标签: objective-c dictionary plist nsdictionary


    【解决方案1】:

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

    如果你想要一个特定的顺序,你必须使用一个支持其内容排序的容器,例如一个数组。

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

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

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


    通过索引字段访问对象:

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

    一个选项是这样的:

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

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

    【讨论】:

    • 谢谢,是的,我明白了。我想我可以很容易地弄清楚如何实施您的第一个建议,这很好,但我试图弄清楚如何使用每个子字典项的索引项来确定顺序。有没有简单的方法来解释?请参阅我正在使用的代码的问题的底部,但显然无法正常工作。
    • sortedArrayUsingComparator
    • @Mrwolfy:没错。在这种情况下,我仍然不会真正推荐这种特定方法,但这是一种选择。
    • 好的,谢谢,是的,似乎比数组方法更复杂,所以我可能会使用它,但它有效。谢谢!
    【解决方案2】:

    这是一个使用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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多