NSArray of int [] - PullRequest
       13

NSArray of int []

7 голосов
/ 29 марта 2011

Мне нужно хранить кучу int [] для моих уровней.

Я решил, что хранение 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,...... }; 

Затем мне нужно получить случайный из них.

Ответы [ 4 ]

10 голосов
/ 29 марта 2011

РЕДАКТИРОВАНИЕ: изменено для использования менее злого метода благодаря комментарию Томми.

Вы можете рассматривать статические массивы как указатели и сохранять их в 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];

Однако я должен согласиться с Фрэнком Си - почемувам нужно использовать массив Какао для хранения этих массивов вообще?Разве вы не можете просто рассматривать весь массив как двумерный массив C?Если в любом случае это статические данные, то динамические аспекты NSMutableArray кажутся в значительной степени излишними.

РЕДАКТИРОВАТЬ 2: Использование массивов C

Если массивы уровней все одинаковыедлина - назовите его LEVEL_SIZE - вы можете построить прямой 2D-массив следующим образом:

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

В любом случае, вы можете выбрать один уровень в качестве указателя:

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 voila.

8 голосов
/ 29 марта 2011

Используйте NSNumber для хранения int в NSMutableArray.

Вот пример кода:

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

// Get 
yourInt = [((NSNumber*)[yourMutableArray objectAtIndex:0]) intValue];
4 голосов
/ 29 марта 2011

Крейг,

Поскольку Objective-C основан на C, и вы можете смешивать как в приложениях iOS, так и OSX, почему бы просто не создать массив целых чисел?

Это даст вам производительностьмасштабирования и сокращения памяти по сравнению с преобразованием всего в NSNumber.

Frank

3 голосов
/ 29 марта 2011

Поместите это в NSNumber:

[array addObject:[NSNumber numberWithInt:5]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...