Objective-C 多维数组

3

我想在我的应用程序中使用可变大小的多维数组来保存数据。我想要使用的数据结构如下,每行的第一个元素后面跟随着相应的多个值。

 array = {   {a, a_val1, a_val2, a_val3}.  
             {b, b_val1},  
             {c, c_val1, c_val2, c_val3, c_val4, c_val5}  
         }

有什么办法可以在Objective-C中实现吗?
3个回答

15

像这样使用NSMutableArray

NSMutableArray *curRow; /* use to access the row while loading with objects */
NSMutableArray *array = [[NSMutableArray alloc] init]; /* your main multidim array */
curRow = [NSMutableArray array];
[curRow addObject:/* what you want here */];
[curRow addObject:/* what you want here */];
[curRow addObject:/* what you want here */];
[array addObject:curRow]; /* first row is added */

/* rinse and repeat */
curRow = [NSMutableArray array];
[curRow addObject:/* what you want here */];
[curRow addObject:/* what you want here */];
[curRow addObject:/* what you want here */];
[array addObject:curRow];

谢谢 - 这很完美。我将把它标记为我的答案,因为它提供了一个通用的解决方案 - 用于在运行时创建动态数组。下一个答案展示了固定大小数组的用法。 - Sam
这个答案好多了。 - michaelsnowden
要调用特定的对象,您可以调用它所在的行(第一组“cur row”为0,第二组为1等)。然后调用它所在的“addObject”(列)号码... 第一个“addObject”是“0”,第二个是“1”等。 [[array objectAtIndex:/*行号*/] objectAtIndex:/*列号*/]; - Albert Renshaw
[(NSMutableArray *)[array objectAtIndex:/*X*/] objectAtIndex:/*Y*/]; - Albert Renshaw

5

使用NSMutableArray

下面是示例,以便您理解...

NSMutableArray * multiArray = [[NSMutableArray alloc] initWithCapacity:5];
[multiArray addObject:[NSArray arrayWithObjects:a,a_val1,a_val2]];
[multiArray addObject:[NSArray arrayWithObjects:a,a_val1,a_val2,a_val3,a_val4]];
[multiArray addObject:[NSArray arrayWithObjects:a,a_val1,a_val5]];
[multiArray addObject:[NSArray arrayWithObjects:a,a_val1,a_val2,a_val3,a_val4,a_val5,a_val6]];

而且 不要忘记释放 multiArray 数组,因为我们已经alloced它...


谢谢你的回答......但是我正在寻找在运行时创建动态多维数组的想法。之前的回答对此非常完美。 - Sam
@Sam 你为什么认为这种方法在运行时也不能使用? - Albert Renshaw
@AlbertRenshaw,这个答案与bigkm的类似,并且可以在运行时使用。但是,它要求您事先有子数组对象可添加(arrayWithObjects:...)。如果,比如说,您不知道初始给定子数组中将有多少个对象,则bigkm的答案允许在需要时即时创建和添加对象。 - leanne

-1

Objective-C没有真正的二维数组类型,但是您可以使用以下代码来实现它。

在您的头文件中 --- yourheader.h

#import <Foundation/Foundation.h>

@interface yourheader : NSObject{

    NSMutableDictionary* DictionaryArrayType;
    NSMutableArray* MultiArrayType;
    NSArray* CaptionTitle;
    NSArray* ObjectValue;

}

@property (strong, nonatomic) NSMutableDictionary* DictionaryArrayType;

@property (strong, nonatomic) NSArray* CaptionTitle;

@property (strong, nonatomic) NSArray* ObjectValue;

@property (strong, nonatomic) NSMutableArray* MultiArrayType;

-(id) AddArrayObjects:(NSString*)_Name : (NSString*)_Surname :(NSString*)_Age;

-(id) AddArrayDictionaryObject:(NSArray*)_ArrayObject : (NSArray*)_ArrayKey;

-(id) AddMultiArrayType:(id)_ArrayObject;

-(void) ShowMultiArrayType:(id)_ArrayObject;

@end

现在将以下内容添加到你的Objective-C文件——objective-c.m
#import "yourheader.h"

@implimentation yourheader

@synthesize DictionaryArrayType;

@synthesize CaptionTitle;

@synthesize ObjectValue;

@synthesize MultiArrayType;


-(id)init {

    if(self = [super init]){

        NSString* const NAME = @"NAME";
        NSString* const SURNAME = @"SURNAME";
        NSString* const AGE = @"AGE";
        //Adding fixed content to CaptionTitle Array
        [self setCaptionTitle:[NSArray arrayWithObjects:NAME, SURNAME, AGE, nil]];

        //add values to ObjectValue array
        [self AddArrayObjects:@"Bob" :@"Obi" :@"200"];

        //add values to dictionary
        [self AddDictionaryArrayType:ObjectValue :CaptionTitle];

        //Add to the Multi dimensional array [][]
        [self AddMultiArrayType:DictionaryArrayType];  

        //add the second row values to ObjectValue array
        [self AddArrayObjects:@"Barack" :@"Obama" :@"50"]; 

        //add values to dictionary
        [self AddDictionaryArrayType:ObjectValue :CaptionTitle];

        //Add to the Multi dimensional array [][]
        [self AddMultiArrayType:DictionaryArrayType];  

        //display the 2d Array
        [self ShowMultiArrayType:MultiArrayType];

    }

    return self;
}


-(id)AddArrayObjects:(NSString *)_name :(NSString *)_surname :(NSString *)_age {

    //Set the Array Objects;
    [self setObjectValue:[NSArray arrayWithObjects:_name, _surname, _age, nil]];

    return self;

}

-(id)AddDictionaryArrayType:(NSArray *)_ArrayObject :(NSArray*)_ArrayKey {

    if(!DictionaryArrayType) {
        //initialize disctionary
        [self setDictionaryArrayType:[NSMutableDictionary dictionary]];
    }
    //add array obeject and Fixed Key decleared in CaptionTitle array
    DictionaryArrayType = [NSMutableDictionary dictionaryWithObjects:_ArrayObject forKeys:_ArrayKey];
    return self;
}

-(id) AddMultiArrayType:(id)_ArrayObject {

    if(!MultiArrayType) {

        [self setMultiArrayType:[NSMutableArray array]];
    }

    [MultiArrayType addObject:_ArrayObject]; 

    return self;
}

-(void)ShowMultiArrayType:_ArrayObject {

    for(id objects in _ArrayObject ) {

        for(id key in objects) {
            NSLog(@"%@ key = : object =  %@", key, [objects objectForKey:key]);

        }
    }
}


@end;

要完成此操作,请将其添加到您的 appdelegate.m 文件中

  yourclassname* _yourclasspointer = [[yourclassname alloc] init];

 [_youclasspointer ShowMultiArrayType:[_yourclasspointer MultiArrayType]];

你应该在控制台中看到它。


1
你的解决方案忽略了 Objective-C 语言惯例,比如以小写字母开头命名属性名称、为所有方法参数命名以及始终使用 getter 和 setter 方法来声明属性。 - jackslash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接