2011-06-14 74 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 ...」開頭的方法