Многомерные массивы - какой самый удобный способ работы с ними в Objective-C? - PullRequest
1 голос
/ 08 июля 2010

Я новичок в Objective-C и пытаюсь найти наиболее удобный способ работы с многомерными массивами в Objective-C.Либо я что-то упускаю, либо с ними очень некрасиво работать.

Допустим, у нас классическая проблема:

  • чтение ввода из файла;в первой строке через пробел ("") - ширина и высота матрицы (например: 3 4)
  • , в следующих строках - содержимое, описанное вышеуказанными значениями

Например:

3 4
a b c d
e f g h
i j k l

Первое решение, о котором я подумал, было:

NSMutableArray *matrix = [[NSMutableArray alloc] initWithCapacity: x]; //x = 3 in this specific case
NSMutableArray *cell;
for(cell in matrix)
{
    cell = [NSMutableArray initWithCapacity: y];
    for(int i = 0; i < y; i++) // y = 4
    {
        //object is a NSString containing the char[i][j] read from the file
        [cell insertObject:object atIndex: i];
    }
}

Это было первое, что я имел в виду, когда думал о том, как мне получить свойЗначения читаются из файла в многомерном массиве.Я знаю, что вы можете использовать массивы C, но, поскольку я буду хранить в них NSObject, я не думаю, что это отличная идея.Тем не менее, с моей точки зрения, легко работать с массивами C, а не с решением, которое я получил с Objective-C.

Есть ли другой способ, которым вы могли бы создать многомерный массив в obj-c и проще, чем приведенный выше??

Как насчет их зацикливания?Я знаю, что могу сделать что-то вроде

NSArray *myArray;
for(int i=0; i < [array count]; i++)
{
    [myArray arrayWithArray: [array objectAtIndex: i]];
    for(int j=0; j < [myArray count]; j++)
    {
        NSLog(@"array cell [%d,%d]: %s", i, i, [myArray objectAtIndex: j]);
    }
}

Но это все же сложнее, чем ваш средний цикл многомерного массива C.

Есть мысли по этому поводу?

Ответы [ 5 ]

1 голос
/ 08 июля 2010

Objective-C - это расширенный набор C, если вы хотите работать с многомерными массивами, как в C, сделайте это так. Если вы хотите работать с объектами, делающими это способом Какао, то это тоже нормально, но вы напишите больше кода для этого.

0 голосов
/ 08 июля 2010

Никто не использует прямые многомерные массивы любого размера на любом языке компьютера (кроме домашней работы).Они просто используют слишком много памяти и поэтому слишком медленные.Objective-C является объектно-ориентированным языком.Создайте класс, который делает то, что вам нужно.

0 голосов
/ 08 июля 2010

Вы всегда можете создать одномерные массивы размером width * height вместо:

const int size = width*height;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];

for (int i=0; i<size; ++i) {
    NSString *string = [NSString stringWithFormat:@"col=%d, row=%d", i%width, i/width];
    [array insertObject:string atIndex:i];
}
0 голосов
/ 08 июля 2010

Вы ничего не можете сделать с NSArray или NSMutableArray в этом отношении. То есть нет ничего подобного

objectAtIndex:i :j
0 голосов
/ 08 июля 2010

Разве вы не можете просто создать массив идентификаторов?

#import <Foundation/Foundation.h>

int main(int argc, char **argv) {

        id ptr[3][4];
        NSObject *p;

        ptr[0][0] = p;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...