Search code examples
iosobjective-carraysnsmutablearrayarc4random

Check if NSMutableArray contains an int


I am making an app which asks the user a series of questions. The question asked depends on the random int produced. When an int is used, I want to add it to an NSMutableArray, and then check if the array contains a number the next time a random number is chosen. I am currently using the following code to do this:

- (void) selectQuestionNumber {
textNum = lowerBounds + arc4random() % (upperBounds - lowerBounds);

if ([previousQuestions containsObject:[NSNumber numberWithInt:textNum]]) {
    [self selectQuestionNumber];
    NSLog(@"The same question number appeared!");
} else {
    questionLabel.text = [self nextQuestion];
    [self questionTitleChange];

    NSLog(@"New question made");
}
[previousQuestions addObject:[NSNumber numberWithInt:textNum]];
}  

However, the code NSLog(@"The same question number appeared!"); is never shown in the console, even when the same question will appear twice.

My code is obviously non-functional, so what code can I use to check if an NSMutable array contains an int?


Solution

  • Original solution (works with Array and Set):

    -(void)selectQuestionNumber
     {
       textNum = lowerBounds + arc4random() % (upperBounds - lowerBounds);
    
        NSPredicate *predicate =  [NSPredicate predicateWithFormat:@"intValue=%i",textNum];
        NSArray *filteredArray = [previousQuestions filteredArrayUsingPredicate:predicate];
    
        if ([filteredArray count]) {
            [self selectQuestionNumber];
            NSLog(@"The same question number appeared!");
        } else {
            questionLabel.text = [self nextQuestion];
            [self questionTitleChange];
    
            NSLog(@"New question made");
        }
        [previousQuestions addObject:[NSNumber numberWithInt:textNum]];
    }
    

    Best solution, and better performance, especialy with mutableSet ( According to Duncan C).

     -(void)selectQuestionNumber
    {
    
    textNum = lowerBounds + arc4random() % (upperBounds - lowerBounds);
    
    if ([previousQuestions containsObject:[NSNumber numberWithInteger:textNum]]) {
        [self selectQuestionNumber];
        NSLog(@"The same question number appeared!");
    } else {
        questionLabel.text = [self nextQuestion];
        [self questionTitleChange];
    
        NSLog(@"New question made");
        // And add the new number to mutableSet of mutableArray.
        [previousQuestions addObject:[NSNumber numberWithInteger:textNum]];
    }
    
    }