2011-08-02 174 views
0

我有一个包含26部电影和每部电影3个问题的数据库。NSMutablearray中的NSMutablearray

我所做的是我的程序从数据库中随机选择一个问题,并将其显示在屏幕上。我遇到的问题是记录这个问题,以免它再次被选中。

到目前为止,我一直在玩这个:

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); 

    } 

我的问题是,数组usedQuestion_id不是在任何usedMovie_id指标的不同,他们都是一样的。如果usedQuestion_id为1,并且usedMovie_id在第一个循环中为13,然后usedQuestion_id为1,3,并且usedMovie_id在第二个循环中为10。 UsedQuestion_id在索引13处的usedMovie_id处(从第一个循环开始)更新为1,3。

另外我需要记录哪个问题已被回答正确和不正确,所以我只显示没有被正确回答的问题。

我不想创建26 nsmutablearrays每个与他们自己的数据。

我在想我可能需要一个nsdictionary,甚至是一个数据库.. 另外我可以在每个问题的答案开始和循环通过每个问题,而不是随机化。

回答

1

如果电影和问题的清单永远不会改变,把它们放到一个NSDictionary一个的.plist文件中,并从那里汲取随机。然后,您可以将问题存储在可变数组中,并针对重复数据进行检查。但是你冒着额外的处理风险追溯更多的随机电影和所有重复的问题。

我喜欢你的想法,把所有的问题随机化,然后依次显示出来。它也会给你最好的机会来匹配数组的索引来纠正/不正确的问题。

在一天结束时,使用CoreData或SQLite数据库来存储所有内容可能是您最有效的选择,但是如果您不熟悉它们,或者不想要这些开销,那么您可以使用创意.plist文件和数组。

+0

谢谢,我在想你说的关于我的问题列表永远不会扩大的问题。 – bigubosu

0

看起来好像你正在进入数据库可能有用的领域,特别是如果在某些时候这4部电影会变成40部电影和数千个问题。如果您愿意尝试一下,Core Data在这里可以提供很多帮助。

它还有助于防止必须对所有这些值进行硬编码,因为您可以从数据库中动态获取它们。

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

+0

感谢您的建议。我现在想避免使用CoreData。相反,我对数据库有一点经验,所以我宁愿使用它。我已经尝试过CoreData,这很令人困惑。 – bigubosu

+0

没问题,当我第一次开始使用它时,我也非常困惑。你可以使用sqlite或者像你说的用一些字典,数组和plists来创作。随你便。 – Kaiser

0

这是给我的位置的其他人。

我所做的是废弃随机随意化的想法。相反,我会创建一个数组,将rowid *(因为我的问题列表在数据库中)放入数组中,然后将rowid列表拖到列表中并将该列表放入数组中。然后我可以使用它链接到数据库并提出问题。

这解决了重复问题的问题。

* rowids是特定问题所在的位置。您可能必须创建自己的主键和内容,具体取决于您如何组织问题。但我发现我可以使用rowid。不需要我使用movie_id然后使用question_id。

**查找fisher-yates算法进行混洗。也有人用代码回答了stackoverflow的例子。