2011-08-02 5 views
0

J'ai une base de données avec 26 films et 3 questions par film.NSMutablearray dans NSMutablearray

Ce que j'ai fait, c'est que mon programme sélectionne aléatoirement une question de la base de données et qu'elle est affichée à l'écran. Ce qui me dérange, c'est d'enregistrer cette question pour qu'elle ne soit plus sélectionnée.

Jusqu'à présent, je joue avec ceci:

usedMovie_id = [[NSMutableArray alloc] initWithCapacity:26]; 
    usedQuestion_id = [[NSMutableArray alloc] initWithCapacity:4]; 

    for (NSInteger i = 0; i < 26; ++i) 
    { 
     [usedMovie_id addObject:[NSNull null]]; 
    } 
    for (NSInteger i = 0; i < 4; ++i) 
    { 
     [usedQuestion_id addObject:[NSNull null]]; 
    } 
    while (i < 10) { 
     int ii = [self genRandomNumberForMovies]; 
     int jj = [self genRandomNumberForQuestions:25]; 
     NSLog(@"ii %d, jj %d", ii,jj); 
     [usedQuestion_id replaceObjectAtIndex:jj withObject:[NSNumber numberWithInt:jj]]; 
     [usedMovie_id replaceObjectAtIndex:ii withObject:usedQuestion_id]; 
     i++; 
     //NSLog(@"movie_id array %@", usedMovie_id); 

    } 

Mon problème est que le tableau usedQuestion_id ne diffère pas à l'un des indices dans usedMovie_id, ils sont tous les mêmes. Si usedQuestion_id a 1 et used_Movie_id est 13 dans la première boucle, puis usedQuestion_id vaut 1, 3 et usedMovie_id est 10 dans la seconde boucle. Le paramètre usedQuestion_id est mis à jour à 1, 3 à l'adresse usedMovie_id à l'index 13 (à partir de la première boucle).

De même, j'ai besoin d'enregistrer quelle question a été répondue correcte et incorrecte, donc je montre seulement les questions qui n'ont pas été répondues correctement.

Je ne veux pas avoir à créer 26 nsmutablearrays chacun avec leurs propres données.

Je pense que je pourrais avoir besoin d'un nsdictionary ou même d'une base de données. Aussi, je pourrais randomiser au début et faire défiler chaque question au lieu de randomiser après que chaque question ait été répondue.

Répondre

1

Si la liste des films et des questions ne change jamais, les mettre dans un NSDictionary dans un fichier .plist et tirer au hasard à partir de là. Vous pouvez ensuite stocker la question dans un tableau mutable et vérifier par rapport à celle-ci pour les doublons. Mais vous courez le risque d'un traitement supplémentaire en arrière pour des films plus aléatoires et des questions qui sont tous des doublons. J'aime votre idée de randomiser toute la liste des questions dès le départ, puis les afficher séquentiellement. Cela vous donnerait également la meilleure chance de faire correspondre l'index du tableau à des questions correctes/incorrectes. A la fin de la journée, utiliser CoreData ou SQLite db pour stocker tout serait probablement votre option la plus efficace, mais si vous n'êtes pas aussi expérimenté avec eux, ou si vous ne voulez pas les frais généraux, vous pourriez être créatif avec fichier .plist et tableaux.

+0

Merci, je pensais à ce que vous avez dit à propos de ma liste de questions ne changeant jamais élargi à ce sujet. – bigubosu

0

Il semble que vous soyez dans le domaine où une base de données peut être utile, surtout si, à un moment donné, ces 4 films se transforment en 40 films et des milliers de questions. Si vous êtes prêt à essayer, Core Data peut vous aider beaucoup ici.

Cela vous évitera également d'avoir à coder en dur dans toutes ces valeurs car vous pouvez les récupérer dynamiquement à partir de la base de données.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

+0

merci pour la suggestion. Je voudrais éviter CoreData pour le moment. Au lieu de cela, j'ai un peu d'expérience dans la base de données, donc je préfère l'utiliser. J'ai essayé CoreData c'était assez déroutant. – bigubosu

+0

Pas de problème, c'était très déroutant pour moi aussi quand j'ai commencé à l'utiliser. Vous pouvez utiliser sqlite ou, comme vous l'avez dit, créer des dictionnaires, des tableaux et des plistes. C'est à vous. – Kaiser

0

Ceci est pour quelqu'un d'autre qui était dans ma position.

Ce que j'ai fait, c'est abandonner l'idée de randomiser sur le pouce. Au lieu de cela, je voudrais créer un tableau, placer les rowids * (parce que ma liste de questions sont dans une base de données) dans le tableau puis mélanger ** la liste des rowids et placer cette liste dans un tableau. Ce que je peux ensuite utiliser pour créer un lien vers une base de données et dessiner une question.

Ceci résout le problème de la répétition de questions.

* Les rowids sont l'emplacement d'une question particulière.vous devrez peut-être créer vos propres clés primaires et d'autres choses en fonction de la façon dont vous avez organisé vos questions. mais j'ai découvert que je pouvais utiliser les rowids. Élimine le besoin pour moi d'utiliser un movie_id et ensuite un question_id.

** Rechercher l'algorithme de Fisher-yates à mélanger. Il y a aussi des exemples sur stackoverflow que les gens ont répondu avec du code.