2009-07-10 85 views
3

當我使用一個NSArray,很容易:如何從NSDictionary中選擇一個隨機密鑰?

NSArray *array = ... 
lastIndex = INT_MAX; 
... 
int randomIndex; 
do { 
    randomIndex = RANDOM_INT(0, [array count] - 1); 
} while (randomIndex == lastIndex); 
NSLog(@"%@", [array objectAtIndex:randomIndex]); 
lastIndex = randomIndex; 

我需要跟蹤的lastIndex的,因爲我想要的隨機性的感覺。也就是說,我不想連續兩次獲得相同的元素。所以它不應該是「真實」的隨機性。

從我可以告訴,NSDictionary不具有像-objectAtIndex :.那麼我怎麼做到這一點?

回答

2

您可以通過allKeys(undefined order)或keysSortedByValueUsingSelector(如果您希望按值排序)獲得一組密鑰。 有一點需要記住(關於lastIndex),即使在排序時,同一個索引可能會隨着字典的增長而引用不同的鍵值對。

其中任何一個(但特別是keysSortedByValueUsingSelector)都會帶來性能損失。

編輯:由於字典不可變,你應該只能調用allKeys一次,然後從中選擇隨機密鑰。

+0

這是一個NSDictionary(不是NSMutableDictionary),所以它不會增長。它將在應用程序啓動時顯式創建,使用[[NSDictionary alloc] initWithObjectsAndKeys:...,nil]; – Elliot 2009-07-10 22:49:54

1

你可以使用下面的代碼:

- (YourObjectType *)getRandomObjectFromDictionary:(NSDictionary *)dictionary 
{ 
    NSArray *keys = dictionary.allKeys; 
    return dictionary[keys[arc4random_uniform((int)keys.count)]]; 
} 

爲了使之更有效率,你可以在一個實例變量緩存keys。希望這可以幫助。

相關問題