3

当我使用 NSArray 时,这很简单:

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: 之类的东西。那么我该如何实现呢?

4

2 回答 2

2

您可以使用allKeys(未定义顺序)或keysSortedByValueUsingSelector(如果您想按值排序 )获得一个键数组。要记住的一件事(关于 lastIndex)是,即使使用排序,随着字典的增长,同一个索引也可能会引用不同的键值对。

其中任何一个(尤其是 keysSortedByValueUsingSelector)都会带来性能损失。

编辑:由于字典不是可变的,你应该能够调用 allKeys 一次,然后从中选择随机键。

于 2009-07-10T22:31:21.850 回答
1

您可以使用以下代码:

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

为了提高效率,您可以缓存keys在实例变量中。希望这可以帮助。

于 2014-04-11T20:12:28.197 回答