Вопрос

Когда я использовал 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 в переменной экземпляра.Надеюсь это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top