Come faccio a selezionare una chiave casuale da un NSDictionary?
-
12-09-2019 - |
Domanda
Quando stavo usando un NSArray, è stato facile:
NSArray *array = ...
lastIndex = INT_MAX;
...
int randomIndex;
do {
randomIndex = RANDOM_INT(0, [array count] - 1);
} while (randomIndex == lastIndex);
NSLog(@"%@", [array objectAtIndex:randomIndex]);
lastIndex = randomIndex;
Ho bisogno di tenere traccia del lastIndex perché voglio la sensazione di casualità. Cioè, non voglio per ottenere lo stesso elemento due volte di fila. Quindi non dovrebbe essere "vera" casualità.
Da quello che posso dire, NSDictionary non ha qualcosa di simile -objectAtIndex :. Allora, come faccio a ottenere questo risultato?
Soluzione
È possibile ottenere una serie di chiavi con allKeys (ordine non definito) o keysSortedByValueUsingSelector (se si desidera l'ordinamento per valore). Una cosa da tenere a mente (per quanto riguarda lastIndex) è che anche con l'ordinamento, lo stesso indice può venire per fare riferimento a una diversa coppia chiave-valore come il dizionario cresce.
Uno di questi (ma soprattutto keysSortedByValueUsingSelector) sarà disponibile con una riduzione delle prestazioni.
EDIT:. Dal momento che il dizionario non è mutevole, si dovrebbe solo essere in grado di chiamare allKeys una volta, e poi basta scegliere tasti a caso da quel
Altri suggerimenti
È possibile utilizzare il codice qui sotto:
- (YourObjectType *)getRandomObjectFromDictionary:(NSDictionary *)dictionary
{
NSArray *keys = dictionary.allKeys;
return dictionary[keys[arc4random_uniform((int)keys.count)]];
}
Per renderlo più efficiente, è possibile memorizzare nella cache keys
in una variabile di istanza. Spero che sia di aiuto.