Создание двумерного массива в Objective-C - PullRequest
23 голосов
/ 06 декабря 2010

Какой самый простой способ объявить двумерный массив в Objective-C?Я читаю матрицу чисел из текстового файла с веб-сайта и хочу взять данные и поместить их в матрицу 3x3.

Как только я прочитал URL в строку, я создаю NSArray и используюКомпонент componentsSeparatedByString для удаления перевода строки каретки и создания каждой отдельной строки.Затем я получаю количество строк в новом массиве, чтобы получить отдельные значения в каждой строке.Это даст mw массив со строкой символов, а не строкой из трех отдельных значений.Мне просто нужно иметь возможность принимать эти значения и создавать двумерный массив.

Ответы [ 6 ]

46 голосов
/ 06 декабря 2010

Если это не обязательно должен быть объект, вы можете использовать:

float matrix[3][3];

для определения массива с плавающей точкой 3x3.

43 голосов
/ 06 декабря 2010

Вы можете использовать массив стилей Objective C.

NSMutableArray *dataArray = [[NSMutableArray alloc] initWithCapacity: 3];

[dataArray insertObject:[NSMutableArray arrayWithObjects:@"0",@"0",@"0",nil] atIndex:0];
[dataArray insertObject:[NSMutableArray arrayWithObjects:@"0",@"0",@"0",nil] atIndex:1];
[dataArray insertObject:[NSMutableArray arrayWithObjects:@"0",@"0",@"0",nil] atIndex:2];

Надеюсь, вы получите ответ из приведенного выше примера.

Cheers, Raxit

16 голосов
/ 11 сентября 2013

Это также будет работать:

    NSArray *myArray = @[
                            @[ @1, @2, @3, @4],
                            @[ @1, @2, @3, @4],
                            @[ @1, @2, @3, @4],
                            @[ @1, @2, @3, @4],
                       ];

В данном случае это массив 4х4 с только числами.

5 голосов
/ 06 декабря 2010

Я не совсем уверен, что вы ищете, но мой подход к двумерному массиву заключался бы в создании нового класса для его инкапсуляции.Обратите внимание: нижеприведенный текст был введен непосредственно в поле ответа StackOverflow, поэтому он не скомпилирован и не протестирован.

@interface TwoDArray : NSObject
{
@private
    NSArray* backingStore;
    size_t numRows;
    size_t numCols;
}

// values is a linear array in row major order
-(id) initWithRows: (size_t) rows cols: (size_t) cols values: (NSArray*) values;
-(id) objectAtRow: (size_t) row col: (size_t) col;

@end

@implementation TwoDArray


-(id) initWithRows: (size_t) rows cols: (size_t) cols values: (NSArray*) values
{
    self = [super init];
    if (self != nil)
    {
        if (rows * cols != [values length])
        {
            // the values are not the right size for the array
            [self release];
            return nil;
        }
        numRows = rows;
        numCols = cols;
        backingStore = [values copy];
    }
    return self;
}

-(void) dealloc
{
    [backingStore release];
    [super dealloc];
}

-(id) objectAtRow: (size_t) row col: (size_t) col
{
    if (col >= numCols)
    {
        // raise same exception as index out of bounds on NSArray.  
        // Don't need to check the row because if it's too big the 
        // retrieval from the backing store will throw an exception.
    }
    size_t index = row * numCols + col;
    return [backingStore objectAtIndex: index];
}

@end
1 голос
/ 23 мая 2017

Надеюсь, это поможет. Это просто пример того, как вы можете инициализировать 2d массив int в коде (Objective C работает)

int **p;
p = (int **) malloc(Nrow*sizeof(int*));
for(int i =0;i<Nrow;i++)
{
    p[i] = (int*)malloc(Ncol*sizeof(int));
}
//put something in
for(int i =0;i<Nrow;i++)
{
    p[i][i] = i*i;
    NSLog(@" Number:%d   value:%d",i, p[i][i]);
}

//free pointer after use
for(int i=0;i<Nrow;i++)
{
    p[i]=nil;
    //free(p[i]);
    NSLog(@" Number:%d",i);
}
//free(**p);
p = nil;
1 голос
/ 02 декабря 2014

Сначала вы должны установить NSMutableDictionary в файле .h

            @interface MSRCommonLogic : NSObject
            {
                NSMutableDictionary *twoDimensionArray;
            }

            then have to use following functions in .m file


            - (void)setValuesToArray :(int)rows cols:(int) col value:(id)value
            {
                if(!twoDimensionArray)
                {
                    twoDimensionArray =[[NSMutableDictionary alloc]init];
                }

                NSString *strKey=[NSString stringWithFormat:@"%dVs%d",rows,col];
                [twoDimensionArray setObject:value forKey:strKey];

            }

            - (id)getValueFromArray :(int)rows cols:(int) col
            {
                NSString *strKey=[NSString stringWithFormat:@"%dVs%d",rows,col];
                return  [twoDimensionArray valueForKey:strKey];
            }


            - (void)printTwoDArray:(int)rows cols:(int) cols
            {
                NSString *strAllsValuesToprint=@"";
                strAllsValuesToprint=[strAllsValuesToprint stringByAppendingString:@"\n"];
                for (int row = 0; row < rows; row++) {
                    for (int col = 0; col < cols; col++) {

                        NSString *strV=[self getValueFromArray:row cols:col];
                        strAllsValuesToprint=[strAllsValuesToprint stringByAppendingString:[NSString stringWithFormat:@"%@",strV]];
                        strAllsValuesToprint=[strAllsValuesToprint stringByAppendingString:@"\t"];
                    }
                    strAllsValuesToprint= [strAllsValuesToprint stringByAppendingString:@"\n"];
                }

                NSLog(@"%@",strAllsValuesToprint);

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