2011-05-02 51 views
0

我想訪問字典存儲元素的方式。有誰能幫我做到這一點。提前致謝!!如何有序地訪問字典?

+1

我不認爲一個普通的字典類會記住插入的順序,因爲它需要額外的時間和空間,而不是一個字典的標準用例。我建議編寫你自己的字典類,它可以保存這些信息。 – Christian 2011-05-02 07:33:46

+0

你不能通過任何SDK方法來做到這一點。 – lostInTransit 2011-05-02 07:40:24

+0

[Objective-C字典是一個有序的容器嗎?]的可能重複(http://stackoverflow.com/questions/1648059/is-the-objective-c-dictionary-an-ordered-container) – outis 2012-02-04 10:40:26

回答

3

字典將其值存儲在由鍵索引的結構中,或者更確切地說由鍵的哈希值存儲。這就是爲什麼他們很快。他們不需要搜索值,他們只需取得一個密鑰的值並直接找到值(在大多數情況下,只有在碰撞密鑰哈希值的情況下,他們必須搜索)。

所以值的保存順序是不可預測的。如果您需要訂單,您需要一個數組或鏈接列表 - 兩個結構都具有一個已定義的存儲值。

如果你同時需要:字典類型的訪問和保存順序,你將不得不尋找一個可能的開放源代碼庫與列表支持的字典或你自己的版本:採取一個字典接口,並實現它,使它得到同時保存在列表和內部字典中。

訪問器方法將轉到字典,但是您可以提供用於列表並按照添加順序返回數據的迭代器。

1

可可中沒有Ordered Dictionary。最好的辦法是創建一個自定義類,它包裝一個字典並在輸入密鑰時保存一組密鑰。這並不難。您的類很可能「掩蓋」的NSMutableDictionary的方法是這樣的:

// innerDict is an NSMutableDictionary 
// keyArray is an NSMutableArray 
- (void)setObject:(id <NSCopying>)anObject forKey:(id)aKey { 
    [innerDict setObject:anObject forKey:aKey]; 
    // Keys are added to the array in the order they go into the dictionary; 
    // users of the class can access the array to get this info 
    [keyArray addObject:aKey]; 
} 

- (id)objectForKey:(id)aKey { 
    return [innerDict objectForKey:aKey]; 
} 

- (void)removeObjectForKey:(id)aKey { 
    [innerDict removeObjectForKey:aKey]; 

    [keyArray removeObject:aKey]; 
} 

- (NSEnumerator *)keyEnumerator { 
    // It's actually better for users of this class to 
    // use fast enumeration on the keyArray; this is just an example 
    return [keyArray objectEnumerator]; 
} 

如果你到讓你的手髒,馬特·加拉格爾有tutorial on collection subclassing,只是恰巧使用有序字典作爲例子。