当前位置:  开发笔记 > IOS > 正文

使用NSMutableArray的2D数组

如何解决《使用NSMutableArray的2D数组》经验,为你挑选了5个好方法。

我需要在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中做到这一点?



1> mouviciel..:

首先,您必须在使用之前分配和初始化对象,例如:NSMutableArray * sections = [[NSMutableArray alloc] initWithCapacity:10];对于行,每个都需要一个对象,而不是一个NSMutableArray * rows;

其次,取决于你是否使用Xcode 4.4+(引入了下标,又称section[i]&section[i] = …),你可能不得不[sections objectAtIndex:i]用于阅读和[section replaceObjectAtIndex:i withObject: objectToAdd]写作.

第三,阵列不能有孔,即obj1,nil,obj2.您必须为每个索引提供实际对象.如果你确实需要什么,你可以使用NSNullobject.

此外,不要忘记您还可以在纯C数组中存储Objective-C对象:

id table[lnum][rnum];
table[i][j] = myObj;


建议使用普通C阵列,特别是在提前知道阵列尺寸的情况下.

2> Alex Rozansk..:

如果要使用数组执行此操作,可以初始化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实例添加更多属性,这将变得更有用.



3> Jack Nutting..:

该语言不支持多维面向对象数组,但您可以创建一个使用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);

再次感谢杰克!!

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有