通过字典循环;为什么我不按字母顺序获取键?

时间:2011-06-14 17:25:23

标签: iphone objective-c nsmutabledictionary s7graphview

我正在使用S7Graphview编写一个iPhone应用程序,我将一些日期和结果保存为.plist作为字典中的键和值,两者都作为字符串。我的plist看起来像这样:

<dict>
<key>2011-05-11</key>
<string>23</string>
<key>2011-05-12</key>
<string>23</string>
<key>2011-05-13</key>
<string>23</string>
<key>2011-05-14</key>
<string>43</string>
<key>2011-06-14</key>
<string>43</string>
</dict>

然后我使用这个循环将这些值加载到graphview中:

NSMutableDictionary* dictionary = [[NSMutableDictionary alloc]init];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
int i = 1;        

if ([dictionary count] > 0) {
for (NSString* key in dictionary){
    NSString* verdiString = [dictionary objectForKey:key];
    CGFloat verdi = [verdiString intValue];
    NSDate *dato = [[NSDate alloc]init];
    NSLog(@"key=%@ value=%@", key, [dictionary objectForKey:key]);
    dato = [self stringTilDato:key];
    [items.list_ addObject:[[GraphInfo alloc] initWithID:i name:verdiString value:verdi date:dato]];
    i++;
}
}

“stringTilDato”方法将日期字符串转换为NSDate。值被加载到items.list中,但顺序错误! NSLog报告:

key=2011-05-14 value=43
key=2011-05-13 value=23
key=2011-05-12 value=23
key=2011-06-14 value=43
key=2011-05-11 value=23
key=2011-05-14 value=43
key=2011-05-13 value=23
key=2011-05-12 value=23
key=2011-06-14 value=43
key=2011-05-11 value=23

(不知道为什么它会通过键两次,顺便说一句,但我不相信这很重要)。我认为按键会按字母顺序读取,或者至少按照plist的顺序读取。为什么plist按此顺序加载到字典中,或者是我的加载循环是什么问题?

希望有人可以帮助我:)

3 个答案:

答案 0 :(得分:7)

字典不是有序数据结构。您可以假设没有特定的键顺序,添加或删除键可以完全改变顺序。如果您需要一个有序的数据结构,那么使用一个数组,或者在获取所有键后对它们进行排序。

答案 1 :(得分:4)

NSDictionary的文档具体说明:

  

数组中元素的顺序   没有定义。

但是,如果您希望按特定顺序排序键,则至少有三种方法可返回已排序的键数组。查看NSDictionary参考页面,了解以“keysSortedBy ...”开头的方法

答案 2 :(得分:2)

字典无法确保有序的键输出。如果您希望按特定顺序显示键,则必须在访问其值并打印结果之前对其进行排序。