我需要在Objective-C中创建一个可变的二维数组.
例如,我有:
NSMutableArray *sections; NSMutableArray *rows;
每个项目都sections
包含一个数组rows
.rows
是一个包含对象的数组.
我想做这样的事情:
[ sections[i] addObject: objectToAdd]; //I want to add a new row
顺序如下:第0节,行:obj1,obj2,obj3第1节,行:obj4,obj5,obj6,obj 7 ...
有没有办法在Objective-C中做到这一点?
首先,您必须在使用之前分配和初始化对象,例如:NSMutableArray * sections = [[NSMutableArray alloc] initWithCapacity:10];
对于行,每个都需要一个对象,而不是一个NSMutableArray * rows;
其次,取决于你是否使用Xcode 4.4+(引入了下标,又称section[i]
§ion[i] = …
),你可能不得不[sections objectAtIndex:i]
用于阅读和[section replaceObjectAtIndex:i withObject: objectToAdd]
写作.
第三,阵列不能有孔,即obj1,nil,obj2.您必须为每个索引提供实际对象.如果你确实需要什么,你可以使用NSNull
object.
此外,不要忘记您还可以在纯C数组中存储Objective-C对象:
id table[lnum][rnum]; table[i][j] = myObj;
如果要使用数组执行此操作,可以初始化sections
数组,然后按如下方式添加行数组:
NSMutableArray *sections = [[NSMutableArray alloc] init]; NSMutableArray *rows = [[NSMutableArray alloc] init]; //Add row objects here //Add your rows array to the sections array [sections addObject:rows];
如果要在特定索引处添加此行对象,请使用以下命令:
//Insert your rows array at index i [sections insertObject:rows atIndex:i];
然后,您可以通过检索数组来修改此行数组:
//Retrieve pointer to rows array at index i NSMutableArray *rows = [sections objectAtIndex:i] //modify rows array here
你总是可以创建自己的Section
一个NSMutableArray
名为的类,它有一个名为的成员rows
; 然后将行存储在此数组中,并将Section
对象存储在数组中:
@interface Section : NSObject { NSMutableArray *rows; }
然后,您只需创建Section
项目,就可以在类中创建方法来添加/删除行项目.然后将所有Sections
项目打包到另一个数组中:
Section *aSection = [[Section alloc] init]; //add any rows to your Section instance here NSMutableArray *sections = [[NSMutableArray alloc] init]; [sections addObject:aSection];
如果要为每个Section
实例添加更多属性,这将变得更有用.
该语言不支持多维面向对象数组,但您可以创建一个使用NSMutableArray完成NSMutableArray的类,如下所示.我没有尝试编译这个或任何东西,我只是输入它.
@interface SectionArray : NSObject { NSMutableArray *sections; } - initWithSections:(NSUInteger)s rows:(NSUInteger)r; + sectionArrayWithSections:(NSUInteger)s rows:(NSUInteger)r; - objectInSection:(NSUInteger)s row:(NSUInteger)r; - (void)setObject:o inSection:(NSUInteger)s row:(NSUInteger)r; @end @implementation SectionArray - initWithSections:(NSUInteger)s rows:(NSUInteger)r { if ((self = [self init])) { sections = [[NSMutableArray alloc] initWithCapacity:s]; NSUInteger i; for (i=0; i你会这样使用它:
SectionArray *a = [SectionArray arrayWithSections:10 rows:5]; [a setObject:@"something" inSection:4 row:3]; id sameOldSomething = [s objectInSection:4 row:3];
4> Matt Mc..:搞什么鬼.只要我们重新回答这个问题,这里就是文字集合语法和视觉格式解释的时代!
如果有人想知道,这有效:
NSMutableArray *multi = [@[ [@[] mutableCopy] , [@[] mutableCopy] ] mutableCopy]; multi[1][0] = @"Hi "; multi[1][1] = @"There "; multi[0][0] = @"Oh "; multi[0][1] = @"James!"; NSLog(@"%@%@%@%@", multi[0][0], multi[1][0], multi[1][1], multi[0][1]);结果:"哦,你好詹姆斯!"
当然,存在尝试类似问题
multi[3][5] = @"?"
并获得无效索引异常的问题,因此我为NSMutableArray编写了一个类别.@interface NSMutableArray (NullInit) +(NSMutableArray *)mutableNullArrayWithSize:(NSUInteger)size; +(NSMutableArray *)mutableNullArraysWithVisualFormat:(NSString *)string; @end @implementation NSMutableArray (NullInit) +(NSMutableArray *)mutableNullArrayWithSize:(NSUInteger)size { NSMutableArray *returnArray = [[NSMutableArray alloc] initWithCapacity:size]; for (int i = 0; i < size; i++) { [returnArray addObject:[NSNull null]]; } return returnArray; } +(NSMutableArray *)mutableNullArraysWithVisualFormat:(NSString *)string { NSMutableArray *returnArray = nil; NSRange bitRange; if ((bitRange = [string rangeOfString:@"^\\[\\d+]" options:NSRegularExpressionSearch]).location != NSNotFound) { NSUInteger size = [[string substringWithRange:NSMakeRange(1, bitRange.length - 2)] integerValue]; if (string.length == bitRange.length) { returnArray = [self mutableNullArrayWithSize:size]; } else { returnArray = [[NSMutableArray alloc] initWithCapacity:size]; NSString *nextLevel = [string substringWithRange:NSMakeRange(bitRange.length, string.length - bitRange.length)]; NSMutableArray *subArray; for (int i = 0; i < size; i++) { subArray = [self mutableNullArraysWithVisualFormat:nextLevel]; if (subArray) { [returnArray addObject:subArray]; } else { return nil; } } } } else { return nil; } return returnArray; } @end正如您所看到的,我们有一个方便的方法来制作一个数组,
NSNull
以便您可以设置放弃的索引.其次,有一个递归方法,用如下的可视格式解析字符串:
[3][12]
(3 x 12数组).如果您的字符串在某种程度上无效,则该方法将返回nil
,但如果它有效,您将获得指定大小的整个多维数组.这里有些例子:
NSMutableArray *shrub = [NSMutableArray mutableNullArrayWithSize:5]; NSMutableArray *tree = [NSMutableArray mutableNullArraysWithVisualFormat:@"[3][12]"]; // 2-Dimensional Array NSMutableArray *threeDeeTree = [NSMutableArray mutableNullArraysWithVisualFormat:@"[3][5][6]"]; // 3-Dimensional Array NSMutableArray *stuntedTree = [NSMutableArray mutableNullArraysWithVisualFormat:@"[6][4][k]"]; // Returns nil您可以将任意多个维度传递到可视格式方法中,然后使用文字语法访问它们,如下所示:
NSMutableArray *deepTree = [NSMutableArray mutableNullArraysWithVisualFormat:@"[5][3][4][2][7]"]; deepTree[3][2][1][0][5] = @"Leaf"; NSLog(@"Look what's at 3.2.1.0.5: %@", deepTree[3][2][1][0][5]);无论如何,这更像是一项运动而不是其他任何事情; 它可能在宏观方案中非常有效......考虑我们如何制作Objective-C对象指针的多维数组.
5> 小智..:感谢杰克的代码,我做了一点工作; 我需要一个多维的nsmutablearray用于我的一个项目中的字符串,它仍然有一些需要修复的东西,但目前仅用于字符串,我会在这里发布,我是开放的建议,因为我只是一个初学者在目标c中...
@interface SectionArray : NSObject { NSMutableArray *sections; } - initWithSections:(NSUInteger)intSections:(NSUInteger)intRow; + sectionArrayWithSections:(NSUInteger)intSections:(NSUInteger)intRows; - objectInSection:(NSUInteger)intSection:(NSUInteger)intRow; - (void)setObject:(NSString *)object:(NSUInteger)intSection:(NSUInteger)intRow; @end @implementation SectionArray - initWithSections:(NSUInteger)intSections:(NSUInteger)intRow { NSUInteger i; NSUInteger j; if ((self = [self init])) { sections = [[NSMutableArray alloc] initWithCapacity:intSections]; for (i=0; i < intSections; i++) { NSMutableArray *a = [NSMutableArray arrayWithCapacity:intRow]; for (j=0; j < intRow; j++) { [a insertObject:[NSNull null] atIndex:j]; } [sections addObject:a]; } } return self; } - (void)setObject:(NSString *)object:(NSUInteger)intSection:(NSUInteger)intRow { [[sections objectAtIndex:intSection] replaceObjectAtIndex:intRow withObject:object]; } - objectInSection:(NSUInteger)intSection:(NSUInteger)intRow { return [[sections objectAtIndex:intSection] objectAtIndex:intRow]; } + sectionArrayWithSections:(NSUInteger)intSections:(NSUInteger)intRows { return [[self alloc] initWithSections:intSections:intRows] ; } @end这工作正常!!!
我目前正在使用它
SectionArray *secA = [[SectionArray alloc] initWithSections:2:2]; [secA setObject:@"Object":0:0]; [secA setObject:@"ObjectTwo":0:1]; [secA setObject:@"ObjectThree":1:0]; [secA setObject:@"ObjectFour":1:1]; NSString *str = [secA objectInSection:1:1]; NSLog(@" object is = %@" , str);再次感谢杰克!!