2011-08-02 124 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的例子。