2013-04-27 44 views
0

如何控制字典或plist項目迭代的順序?如何控制從plist項目創建的字典的迭代順序?

我有一個plist 65項。每個項目是一個包含三個項目的詞典,一個數字(索引)以及兩個圖像名稱的字符串。 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]]; 

回答

1

詞典是明確和必然無序。

如果您想要特定的訂單,則必須使用支持其內容排序的容器,例如數組。

您可能想要做的是將plist中的外部容器更改爲數組,刪除索引字段並將其替換爲名稱或ID字段,其中包含現在是字典的鍵。

或者,您可以保持原樣,並創建一個輔助數組,以允許按索引訪問元素,而不是按鍵。

(通常情況下,壽」,如果你遍歷的東西,這東西應該會是一個數組,而不是一本字典,雖然這不是一個硬性的規則。)


至於訪問通過他們的索引字段對象:

這一點有點晦澀,但是很簡單的事:

一種選擇是這樣的:

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

這假定結果數組是密集的;即所有指標都存在,沒有差距。

+0

謝謝,是的,我明白了。我想我可以很容易地弄清楚如何實現你的第一個建議,這很好,但我試圖弄清楚如何使用每個子字典項目的索引項來確定順序。有沒有簡單的方法來解釋?看到我的問題底部我正在使用的代碼,但顯然不工作。 – Mrwolfy 2013-04-27 11:43:27

+0

@Mrwolfy:查看更新。 – 2013-04-27 11:56:22

+0

sortedArrayUsingComparator – Mrwolfy 2013-04-27 12:15:59

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); 
    }