Как выбрать случайный ключ из NSDictionary? - PullRequest
3 голосов
/ 11 июля 2009

Когда я использовал 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;

Мне нужно следить за последним индексом, потому что я хочу ощущения случайности. То есть я не хочу получать один и тот же элемент дважды подряд. Так что это не должно быть «истинной» случайностью.

Из того, что я могу сказать, NSDictionary не имеет что-то вроде -objectAtIndex :. Итак, как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 11 июля 2009

Вы можете получить массив ключей с помощью allKeys (неопределенный порядок) или keysSortedByValueUsingSelector (если вы хотите отсортировать по значению). Следует иметь в виду (в отношении lastIndex), что даже при сортировке один и тот же индекс может ссылаться на другую пару ключ-значение по мере роста словаря.

Любой из них (но особенно keysSortedByValueUsingSelector) будет приводить к снижению производительности.

РЕДАКТИРОВАТЬ: Поскольку словарь не является изменяемым, вы должны просто иметь возможность вызвать allKeys один раз, а затем просто выбрать случайные ключи из этого.

1 голос
/ 12 апреля 2014

Вы можете использовать код ниже:

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

Чтобы сделать его более эффективным, вы можете кэшировать keys в переменной экземпляра. Надеюсь это поможет.

...