2011-09-18 73 views
3

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

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

任何想法如何在objective-c中实现?

回答

-1

的Objective-C没有一个真正的2维数组类型,但是你可以用 以下代码实现它..

在你的头文件

--- 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的文件----客观厘米

#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

您的解决方案忽略了客观的c语言约定,例如以小写字母开头的属性名称,命名所有方法参数并始终使用声明属性的getter和setter方法 – jackslash

14

使用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]; 
+0

谢谢 - 这是完美的。我将这个标记为我的答案,因为它提供了一个通用的解决方案 - 用于在运行时创建动态数组。下一个答案显示了固定大小数组的用法。 – Sam

+0

这个答案好多了 – michaelsnowden

+0

要调用一个特定的对象,你可以调用它所在的行(第一组“行”将是0,第二组是1等)。然后调用“addObject”(列数)它是...第一个“addObject”是“0”,第二个是“1”,等等 '[[array objectAtIndex:/ *行号* /] objectAtIndex:/ *列号* /] ;' –

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

+0

感谢您的回答....但我一直在寻找创建一个动态多线程的想法,运行时维数组。事先的答案是完美的。 – Sam

+0

@Sam为什么你认为这种方法不能在运行时使用? –

+0

@AlbertRenshaw,这个答案类似于bigkm的,它可以在运行时使用。但是,它要求您提前添加子数组的对象(arrayWithObjects:...)。例如,如果你不知道最初在给定的子数组中有多少物体,那么bigkm的答案允许创建对象并“即时”添加。 – leanne