我有一个数据库,里面有26部电影,每部电影有3个问题。
我所做的是我的程序从数据库中随机选择一个问题,并将其显示在屏幕上。我遇到的问题是记录这个问题,这样它就不会再次被选中。
到目前为止,我一直在玩这个:
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,usedMovie_id为10。在索引13处的usedMovie_id处,usedQuestion_id被更新为1,3(来自第一个循环)。
此外,我需要记录哪些问题已经回答正确和不正确,所以我只显示没有正确回答的问题。
我不想创建26个nsmutablearray,每个都有自己的数据。
我在想,我可能需要一个nsdictionary,甚至一个数据库。此外,我可以在开始时随机化,并循环通过每个问题,而不是在每个问题得到回答后随机化。
发布于 2011-08-03 02:56:50
如果影片和问题列表从不更改,请将它们放入.plist文件内的NSDictionary中,然后从其中随机抽取。然后,您可以将问题存储在可变数组中,并对照该数组检查重复项。但是你冒着额外处理更多随机电影和问题的风险,这些问题都是重复的。
我确实喜欢你的想法,即将整个问题列表随机化,然后按顺序显示它们。它还将使您有最好的机会将数组的索引与正确/不正确的问题进行匹配。
归根结底,使用CoreData或SQLite db来存储所有内容可能是最有效的选择,但是如果您没有使用它们的经验,或者不想要这样的开销,那么您可以使用.plist文件和数组。
发布于 2011-08-03 02:48:00
这看起来确实像是进入了一个数据库可能会有帮助的领域,特别是如果在某个时候这4部电影变成了40部电影和数千个问题。如果您愿意尝试一下,Core Data在这里可以提供很多帮助。
它还有助于避免硬编码所有这些值,因为您可以从数据库中动态获取它们。
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html
发布于 2011-08-04 21:55:39
这是给任何处在我这个位置的人的。
我所做的就是放弃随机化的想法。相反,我会创建一个数组,将rowids* (因为我的问题列表在数据库中)放入数组,然后将rowids列表打乱**并将该列表放入数组。然后,我可以使用它链接到数据库并绘制一个问题。
这解决了重复问题的问题。
*rowids是特定问题所在的位置。您可能需要创建自己的主键等内容,这取决于您组织问题的方式。但我发现我可以用到机器人。我不再需要先使用movie_id,然后再使用question_id。
**查找fisher-yates算法以进行混洗。还有一些关于stackoverflow的例子,人们已经用代码来回答了。
https://stackoverflow.com/questions/6916918
复制相似问题