2011-03-29 21 views
6

Necesito almacenar un montón de int [] para mis niveles.NSArray de int []

Decidí que almacenar los int [] 's en un NSMutableArray y obtener uno al azar de la matriz sería una buena manera de hacerlo.

Thing is, an int [] no es un objeto y no se puede agregar dentro de una matriz obj-c.

¿Alguien tiene alguna sugerencia sobre cómo puedo obtener una matriz entera aleatoria?

Mis matrices se ve así:

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,...... }; 

entonces necesito para obtener una al azar uno de estos.

Respuesta

9

EDIT: modificado para utilizar un método menos mal cortesía de comentario de Tommy.

Puede tratar los arreglos estáticos como punteros y almacenarlos en NSValue objetos:

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

... 

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

Como alternativa, puede envolver cada matriz individual en su propia NSData objeto y almacenar los de la matriz mutable:

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

... 

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

Tengo que estar de acuerdo con Frank C, sin embargo, ¿por qué necesitas usar una matriz de Cocoa para almacenar estas matrices? ¿No puedes tratar todo el lote como una matriz 2D C? Si de todos modos son datos estáticos, los aspectos dinámicos de NSMutableArray parecen bastante superfluos.

EDIT 2: utilizando matrices C

Si las matrices de nivel son todos la misma longitud - llamarlo LEVEL_SIZE - se puede construir una matriz 2D recta como esto:

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

, tendrá que compilar cada arreglo por separado y luego juntarlos después:

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, ...}; 

De cualquier manera, yo u puede arrancar un nivel como un puntero:

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

Para empezar, tendrá NUM_LEVELS niveles - en su caso 50 - lo que se adhieren que muchos índices 0..49 en su conjunto, como mutable NSNumber objetos:

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

Use esta matriz para su recuento, la obtención y la eliminación de las necesidades. Cuando tiras de un objeto NSNumber a cabo, lo utilizan para indexar en la matriz niveles para obtener el nivel:

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

Et voila.

+1

Puede almacenar punteros en objetos a través de NSValue + valueWithPointer: y [instanceOfNSValue pointerValue], no es necesario hacer ninguna suposición sobre los tamaños relativos de punteros y números enteros. Pero creo que el afiche quiere que los números individuales sean objetos sin, ya sabes, el costo de que sean objetos. – Tommy

+0

No necesito usar necesariamente un NSMutableArray, es solo que tienen una API fácil de conteo, objectatindex y agregar/eliminar. –

+0

@Tommy gracias por señalar eso, he actualizado la respuesta en consecuencia. – walkytalky

2

caja en un NSNumber:

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

Pensé en esto, pero literalmente tendré miles de enteros generados automáticamente. Esta sería una solución muy desordenada. Además, son estáticos si ayuda. –

+0

Así que intente esto: http://www.cocoabyss.com/foundation/collections-integers-performance/ – Nyx0uf

+0

Lo siento, pero esto no ayuda. Mi matriz se ve así: 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, ......} Necesito obtener uno al azar de estos –

8

Uso NSNumber int para almacenar en una NSMutableArray.

Aquí es código de ejemplo:

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

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

Craig,

Como Objective-C se basa en C y se puede entremezclar tanto en aplicaciones de iOS o OSX ¿por qué no crear una matriz de enteros?

Esto le daría el rendimiento de escala y reducción en memoria frente a la conversión de todo a NSNumber.

Frank

+0

+1 para no olvidar Objetivo-C es C! – Taum

+0

Estoy usando un int []. Estoy tratando de evitar el uso innecesario de múltiples conversiones de NSNumbers y cosas por el estilo. Gracias de todos modos :) –

+0

@ Craig No estoy sugiriendo usar NSNumber, de hecho es todo lo contrario. Un 'int []' funciona bien por sí mismo. –