2011-03-29 24 views
6

我需要爲我的級別存儲一堆int []。INTArray []

我決定將int []存儲在一個NSMutableArray中,並從數組中獲取一個隨機值將是一個很好的方法。

事情是,一個int []不是一個對象,你不能將它添加到一個obj-c數組中。

有沒有人有關於如何獲得隨機整數數組的建議?

我的數組是這樣的:

int lvl1[] { 4,80,49,6,40,77,21,20,91,5,100,91,...... }; 
int lvl2[] { 20,260,385,20,290,448,21,210,329,21,...... }; 
int lvl3[] { 441,21,90,364,21,70,385,21,170,434,...... }; 
... 
int lvl50[] { 441,21,90,364,21,70,385,21,170,434,...... }; 

然後我需要得到這些的隨機一個。

回答

9

編輯:改爲使用湯米的評論的少邪方法禮貌。

你可以把靜態數組的指針,並將它們存儲在NSValue對象:

[mutableArray addObject:[NSValue valueWithPointer:lvl1]]; 

... 

int* level = [(NSValue*)[mutableArray objectAtIndex:whatever] pointerValue]; 
int someContainedInt = level[index]; 

或者,你可以在自己的NSData對象包裝每個單獨的陣列和存儲那些易變的數組中:

[mutableArray addObject:[NSData dataWithBytes:lvl1 length:sizeof(int) * lengthOfArray]]; 

... 

const int* level = (const int*) [(NSData*) [mutableArray objectAtIndex:whatever] bytes]; 

但是我必須同意Frank C,但是 - 爲什麼你需要使用Cocoa數組來存儲這些數組呢?難道你不能把整個作品當作2D C數組嗎?如果它是靜態數據,那麼NSMutableArray的動態方面顯得非常多餘。

編輯2:使用C數組

如果你的水平陣列都具有相同的長度 - 稱之爲LEVEL_SIZE - 你可以建立一個直二維數組是這樣的:

static int levels[][LEVEL_SIZE] = 
{ 
    {1, 2, 3, 4, ...}, 
    {15, 17, 19, 21, ...}, 
    {8, 7, 6, 5, ...} 
}; 

否則,您需要分別構建每個陣列,然後將它們放在一起:

static int level1[] = {1, 2, 3, 4, ...}; 
static int level2[] = {15, 17, 19, 21, ...}; 
static int level3[] = {8, 7, 6, 5, ...}; 
... 
static int* levels[] = {lvl1, lvl2, lvl3, ...}; 

無論哪種方式,喲u能挖出一個級別爲指針:

int* level = levels[0]; 
printf("%d\n", level[1]); // should print 2 

首先,你必須NUM_LEVELS水平 - 你的情況50 - 這樣堅持下去,很多指標0..49到您的可變數組,如NSNumber對象:

NSMutableArray* levelIndices = [NSMutableArray arrayWithCapacity:NUM_LEVELS]; 
for (int i = 0; i < NUM_LEVELS; ++i) 
    [levelIndices addObject:[NSNumber numberWithInt:i]]; 

使用此陣爲您計數,獲取和刪除需求。當你拉一個NSNumber對象時,它使用索引到水平陣列來獲得級別:

int* level = levels[[someNSNumber intValue]]; 

的Et瞧。

+1

您可以通過NSValue + valueWithPointer:[instanceOfNSValue pointerValue]將對象存儲在對象中,不需要對指針和整數的相對大小進行任何假設。但我認爲海報希望單個數字成爲沒有的對象,你知道它們是物體的成本。 – Tommy 2011-03-29 11:51:09

+0

我不需要必須使用NSMutableArray,它只是它們有一個簡單的API計數,objectatindex和添加/刪除。 – 2011-03-29 11:58:24

+0

@Tommy感謝您指出,我相應地更新了答案。 – walkytalky 2011-03-29 12:46:14

2

箱成一個的NSNumber:

[array addObject:[NSNumber numberWithInt:5]]; 
+0

我想過這個,但我會從字面上自動生成數千個整數。這將是一個非常混亂的解決方案。此外,如果它有幫助,它們是靜態的。 – 2011-03-29 08:43:39

+0

所以試試這個:http://www.cocoabyss.com/foundation/collections-integers-performance/ – Nyx0uf 2011-03-29 08:45:36

+0

對不起,但這並沒有幫助。我的數組看起來像這樣: int lvl1 [] {4,80,49,6,40,77,21,20,91,5,100,91,......} int lvl2 [] {20,260,385,20,290,448 ,21,210,329,21,......} int lvl3 [] {441,21,90,364,21,70,385,21,170,434,......} 然後我需要得到一個隨機的 – 2011-03-29 10:31:39

8

使用NSNumber爲INT存儲在一個NSMutableArray。

這裏的示例代碼:

// Add 
[yourMutableArray addObject:[NSNumber numberWithInt:yourInt]]; 

// Get 
yourInt = [((NSNumber*)[yourMutableArray objectAtIndex:0]) intValue]; 
4

克雷格,

客觀-C是基於C,你可以混合使用無論是在iOS或OSX應用程序爲什麼不只是創建整數數組?

這會給你規模和減少內存的性能與將所有內容轉換爲NSNumber。

弗蘭克

+0

+1不要忘記Objective-C是C! – Taum 2011-03-29 12:02:06

+0

我正在使用一個int []。我試圖避免使用不必要地使用NSNumbers的多個轉換器等。無論如何謝謝:) – 2011-03-29 12:04:43

+0

@Craig我不是建議使用NSNumber,實際上它是相反的。一個'int []'可以很好地工作。 – 2011-03-30 08:54:03

相關問題