2010-06-20 21 views
0

我想以隨機的,不重複的順序製作一個對象數組。如下推薦使用NSMutableSet進行繁重的升級:How to check repetition of numbers in an array?NSMutableSet和NSArray排序,如何保持它們一致?

我在創建後將它們轉儲到NSArray中以訪問它們,但NSArray不保留在我將它們放置在NSMutableSet中的順序中。讓它更令人困惑的是它不一致。

我的代碼:

NSArray *puzzleImages = [[NSArray alloc] initWithObjects:@"elephant.png", @"gorilla.png", @"lion.png", @"zebra.png", @"flamingo.png", @"hyena.png", @"seal.png", @"hippo.png", @"rhino.png", @"tiger.png", @"macaw.png", @"bear.png", nil]; 

NSArray *puzzleSounds = [[NSArray alloc] initWithObjects:@"elephant", @"gorilla", @"lion", @"zebra", @"flamingo", @"hyena", @"seal", @"hippo", @"rhino", @"tiger", @"macaw", @"bear", nil]; 

NSMutableSet *aImages1 = [NSMutableSet setWithCapacity:2]; 
NSMutableSet *aSounds1 = [NSMutableSet setWithCapacity:2]; 
NSMutableSet *aValues1 = [NSMutableSet setWithCapacity:2]; 
while([aImages1 count]<=1){ 
    int Randnum1 = arc4random() % 11; 
    [aImages1 addObject:[puzzleImages objectAtIndex:Randnum1]]; 
    [aSounds1 addObject:[puzzleSounds objectAtIndex:Randnum1]]; 
    [aValues1 addObject:[NSNumber numberWithInt:Randnum1]]; 
    NSLog(@"image:%@, sound:%@, value:%@",[puzzleImages objectAtIndex:Randnum1],[puzzleSounds objectAtIndex:Randnum1],[NSNumber numberWithInt:Randnum1]); 
} 

NSArray *arrayOfImages1 = [aImages1 allObjects]; 
NSLog(@"arrayOfImages1: %@",arrayOfImages1); 

NSArray *arrayOfSounds1 = [aSounds1 allObjects]; 
NSLog(@"arrayOfSounds1: %@",arrayOfSounds1); 

NSArray *arrayOfValues1 = [aValues1 allObjects]; 
NSLog(@"aValues1: %@",aValues1); 

這裏是我的輸出:

2010-06-20 16:13:14.572 MatchGame[22675:207] image:lion.png, sound:lion, value:2 
2010-06-20 16:13:14.574 MatchGame[22675:207] image:macaw.png, sound:macaw, value:10 
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfImages1: (
"lion.png", 
"macaw.png") 
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfSounds1: (
macaw, 
lion) 
2010-06-20 16:13:14.576 MatchGame[22675:207] aValues1: {(
2, 
10)} 

如何赫克沒有的金剛鸚鵡的聲音結束了上述獅子的聲音?當然,它並不總是會發生,但它會在遊戲結束時破壞遊戲。我確定我錯過了一些愚蠢的東西,但花了足夠的時間試圖自己弄清楚。

+0

我沒有看到任何鏈接,你說「在這裏推薦」。 – JWWalker 2010-06-20 21:00:39

回答

3

套件未訂購。特別是,您從中獲得的順序取決於您放入的對象,而不是您添加它們的順序。 (通常它們是使用某種對象散列來實現的,儘管我不知道如果是這種情況,那麼我不知道這是什麼意思。)

既然你想保留一堆項目鏈接,一個選項是將一個對象包含它們的類,並將其存儲在集合中。然後你可以把它拿出來,並閱讀其不同的領域。

另一種選擇只是加擾一個索引列表,然後按照該順序訪問各個原始數組中的對象。

更新:您鏈接到的帖子正在解決您的一個相當不同的問題。在你的情況下,使用設置順序隨機是真的是錯誤的事情,因爲排序不會實際上隨機。正確的做法是打亂單個索引數組,例如:

NSMutableArray *indices = [NSMutableArray arrayWithCapacity:11]; 
for (int i = 0; i < 11; ++i) 
    [indices addObject:[NSNumber numberWithInt:i]]; 
for (int i = 0; i < 11; ++i) 
    [indices exchangeObjectAtIndex:i withObjectAtIndex:(arc4random() % 11)]; 

NSLog(@"First random image: %@", [puzzleImages objectAtIndex:[[indices objectAtIndex:0] intValue]]); 

依此類推。你唯一性的保證來自於你從列表中的索引0..10開始,然後洗牌,而不是試圖從可能產生重複的隨機數發生器中召喚索引本身。

+0

我試過了,但無法弄清楚如何訪問Set中的對象。例如,我會創建一個NSMutableSet * randomSetOfNumbers,然後抓取每個數據並用我需要的對象創建一個數組。 也許我錯了嗎?我對obj-c也很新,所以我可能會在你的解釋中遺漏一些東西。 – 2010-06-20 21:17:30

+1

@勞倫斯查看更新。不要使用一套,這裏不適合。根據您放入索引列表獲得唯一性保證,然後相應地訪問其他內容。 – walkytalky 2010-06-20 21:22:41

+0

這很有道理,代碼有意義。我想我正在嘗試設置,因爲它似乎很快解決了問題。 當我嘗試運行代碼時,出現無效操作數到二進制%錯誤。 – 2010-06-20 21:34:35

1

集合沒有順序 - 所以如果你想保持事物的順序相同,你需要使用數組。

同樣在這種情況下,如果在原始數組中有兩個相同的項目,那麼您將獲得更少的元素。

+0

我不使用數組的原因是存在重複的風險。沒有內置的「保持它們獨特」的檢查器,因爲它有一套。我敢肯定,我可以在添加對象之前檢查該對象的數組,但試圖避免這種情況。 – 2010-06-20 21:15:35

+0

所有你需要做的就是發送'-containsObject:'到一個數組,看它是否已經存在。所以這不是那麼多額外的工作(對於你來說,可能會對大型數組產生性能影響)。 – JeremyP 2010-06-21 08:44:49