Как выбрать случайный ключ из NSDictionary?
-
12-09-2019 - |
Вопрос
Когда я использовал 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:.Итак, как мне это сделать?
Решение
Вы можете получить массив ключей с помощью всеКлючи (неопределенный порядок) или ключиSortedByValueUsingSelector (если вы хотите сортировать по значению). Следует иметь в виду (относительно LastIndex): даже при сортировке один и тот же индекс может относиться к другой паре ключ-значение по мере роста словаря.
Любой из них (но особенно keySortedByValueUsingSelector) приведет к снижению производительности.
РЕДАКТИРОВАТЬ:Поскольку словарь не является изменяемым, вы можете просто один раз вызвать allKeys, а затем просто выбрать из него случайные ключи.
Другие советы
Вы можете использовать код ниже:
- (YourObjectType *)getRandomObjectFromDictionary:(NSDictionary *)dictionary
{
NSArray *keys = dictionary.allKeys;
return dictionary[keys[arc4random_uniform((int)keys.count)]];
}
Чтобы сделать его более эффективным, вы можете кэшировать keys
в переменной экземпляра.Надеюсь это поможет.