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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top