2013-05-28 24 views
5

Ho un NSArray con 17 oggetti, qualcosa di simile:Ottenere un oggetto a caso da NSArray senza duplicazione

NSArray *objArray = [[NSArray alloc]initWithObjects: @"1",@"2",@"3",@"4",@"5",@"6" 
,@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17", nil]; 

e un int con un numero casuale come segue:

int random = arc4random()%17+1; 

voglio ottenere un oggetto casuale da questo NSArray senza che sia un duplicato, anche se ho chiuso l'app (forse utilizzando NSUserDefaults).

Se ho ottenuto tutti gli oggetti, voglio generare una nuova sequenza casuale per gli stessi oggetti.

risposta

7

È possibile eseguire questa operazione eseguendo una copia mutabile dell'array e dopo aver effettuato una selezione casuale da tale array, rimuovere lo stesso oggetto. Quando si desidera salvare la matrice, salvare la matrice mutabile stessa, quindi riprendere da dove si era interrotta al riavvio dell'app. Questo piccolo test app fa quello e solo registra il valore del pick casuale:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.objArray = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17"]; 
    self.mut = [self.objArray mutableCopy]; 
} 

-(IBAction)pickNumber:(id)sender { 
    int index = arc4random_uniform(self.mut.count); 
    NSLog(@"%@", self.mut[index]); 
    [self.mut removeObjectAtIndex:index]; 
    if (self.mut.count == 0) { 
     self.mut = [self.objArray mutableCopy]; 
     NSLog(@"*******************"); 
    } 
} 
3

Come punto di partenza, si potrebbe rimescola il tuo array:

+ (NSArray *)arrayByShufflingArray:(NSArray *)array 
{ 
    // Fisher-Yates algorithm 
    NSMutableArray *result = [array mutableCopy]; 
    NSUInteger count = [result count]; 
    for (NSInteger i = ((NSInteger) count) - 1; i > 0; i--) { 
     NSUInteger firstIndex = (NSUInteger)i; 
     NSUInteger secondIndex = arc4random() % (NSUInteger)(i + 1); 

     [result exchangeObjectAtIndex:firstIndex withObjectAtIndex:secondIndex]; 
    } 

    return result; 
} 

Passo attraverso ogni elemento mescolate e quando si arriva alla fine, rimpasto.

Può ancora accadere che un oggetto sia selezionato due volte di seguito quando l'ultimo elemento di uno shuffle è uguale al primo del successivo shuffle. Se vuoi evitare questo, dovrai aggiungere del codice aggiuntivo.

+0

TI ha provato questa idea, ma ho chiamato oggetti duplicati, BTW uno dei miei oggetti "XXX" è stato chiamato 3 volte di seguito con questa metodologia – Mutawe

+0

@Mutawe se si rimischia l'array, è quindi possibile passare attraverso gli oggetti in ordine, non c'è bisogno di selezionare casualmente. – Greg

+0

OK !!!, ora ho capito, lo proverò e risponderò io – Mutawe

-1

Basta copiare e incollare

-(NSMutableArray*)getRandomValueFromArray:(NSMutableArray*)arrAllData randomDataCount:(NSInteger)count { 
NSMutableArray *arrFilterData = [[NSMutableArray alloc]init]; 
for(int i=0; i<count; i++){ 

    NSInteger index = arc4random() % (NSUInteger)(arrAllData.count); 
    [arrFilterData addObject:[arrAllData objectAtIndex:index]]; 
    [arrAllData removeObjectAtIndex:index]; 
} 
return arrFilterData; 
} 

Nota: count = numero di valori casuali che si desidera andare a prendere da array.

Problemi correlati