2011-06-14 32 views
2

我正在使用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 

(不知道为什么它会通过按键两次,顺便说一句,但我dont't认为这很重要)。我认为钥匙可以按字母顺序阅读,或至少按照plist的顺序阅读。为什么plist会按照这个顺序加载到字典中,还是我的加载循环是问题?

希望有人可以帮我:)

回答

7

字典不是一个有序的数据结构。您可以假定没有特定的密钥顺序,添加或移除密钥可以完全改变顺序。如果你需要一个有序的数据结构然后使用一个数组,或者在获得所有的键排序之后。

+0

谢谢!我尝试从字典中获取所有密钥,将它们转换为日期,然后对数组进行排序。然后循环使用排序数组的顺序字典是在做的伎俩! – Jambaman 2011-06-15 15:37:38

2

词典不能确保有序的键输出。如果要按特定顺序显示键,则必须在访问其值并打印结果之前对它们进行排序。

4

为NSDictionary中的文档特别说:

阵列 中的元素的顺序没有限定。

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