0

我正在传递一个具有元素“1,2,3,4,5,6,7”的一维数组,并且在我的代码中我想将此数组转换为二维数组。二维数组的列数将由 user 指定。说如果我将列值设置为 3

那么输出的二维数组应该是格式

123
456
7

我班级的 .m 文件

-(NSMutableArray *)OneToTwoDimensionalArray:(NSMutableArray *)values :(NSInteger)columns
{
    NSMutableArray * twoDimensional=[[NSMutableArray alloc]initWithCapacity:columns];
    for(int i=0;i<columns;i++)
    {
        [twoDimensional insertObject:values atIndex:i];
    }
    return twoDimensional;
}

视图控制器.m 文件

   EPArray *arr=[[EPArray alloc]init];
    int columns=4;
    arr1=[[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",nil];
    NSMutableArray *finalresult=[arr OneToTwoDimensionalArray:arr1 :columns];
    for(int i=0;i<columns;i++)
    {
        NSLog(@"%@",[finalresult objectAtIndex:i]);
    }
4

3 回答 3

1

尝试这个,

NSArray *array = @[@"1", @"2", @"3", @"4", @"5", @"6", @"7"];
int noOfColumns = 3;

NSMutableArray *outerArray = [[NSMutableArray alloc] init];

for (int counter = 0; counter < [array count]; counter = counter + noOfColumns) {
    NSMutableArray *innerArray = [[NSMutableArray alloc] init];
    for (int arrayIndex = counter; ((arrayIndex < counter + noOfColumns) && (arrayIndex < [array count])); arrayIndex++) {
        [innerArray addObject:array[arrayIndex]];
    }
    [outerArray addObject:innerArray];
}

NSLog(@"outerArray = %@", outerArray);

这里outerArray将给出具有提供的列值的二维数组。上面的代码可读且易于维护,特别是如果您想进行一些快速更改。

输出:

outerArray = (
        (
        1,
        2,
        3
    ),
        (
        4,
        5,
        6
    ),
        (
        7
    )
)
于 2013-01-30T07:47:39.483 回答
0

在我的另一个答案(我更喜欢)旁边,我想提供另一个解决方案,它使用更传统的 C 风格编程,但可读性很强。

NSUInteger columnWidth = 3;
NSArray *array =  @[@1, @2, @3, @4 ,@5, @6, @7];
NSMutableArray *newArray = [NSMutableArray array];
NSUInteger columnIdx = 0;
for (NSUInteger count = 0; count < [array count]; ++count) {
    if (columnIdx == 0) {
        [newArray addObject:[NSMutableArray array]];
    }
    NSMutableArray *lastArray = [newArray lastObject];
    [lastArray addObject:array[count]];
    columnIdx = (++columnIdx)%columnWidth;
}

newArray 现在包含所需的子数组。

请注意,此解决方案也使用模运算符columnIdx = (++columnIdx)%columnWidth;
而不是这个,你也可以写

++columnIdx;
if(columnIdx == columnWidth) columnIdx = 0;
于 2013-01-30T11:49:35.927 回答
0
NSUInteger columnWidth = 3;
NSArray *array = @[@1, @2, @3, @4 ,@5, @6, @7];
NSMutableArray *mArray =[NSMutableArray array];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx % columnWidth == 0) {
        [mArray addObject:[NSMutableArray array]];
    }
    [[mArray objectAtIndex:[mArray count]-1] addObject:obj];
}];

mArray现在包含 3 个数组

(
    (
        1,
        2,
        3
    )
,
    (
        4,
        5,
        6
    )
,
    (
        7
    )
)

此代码使用模运算符来查找一个数除以另一个数的余数。

if (idx % 3 == 0) {
    [mArray addObject:[NSMutableArray array]];
}

如果没有余数,它必须是索引 0,3,6,...。在这种情况下,将一个新数组添加到外部数组中。对象总是添加到最后一个数组中。

另请注意,使用enumerateObjectsUsingBlock:应该比使用 c-style for( for(int i=0;i<columns;i++)) 甚至快速枚举更快。


我添加了第二个答案,它只使用 C 结构而不是块,但我更喜欢这个。


并且——当然——你应该考虑在 NSArray 上使用一个类别

@interface NSArray (Columns)
-(NSArray *)arrayOfArraysWithColumnWidth:(NSUInteger)width;
@end


@implementation NSArray (Columns)
-(NSArray *)arrayOfArraysWithColumnWidth:(NSUInteger)width
{
    NSAssert(width > 0, @"width need to be 1 or greater");//sanity check
    NSMutableArray *mArray =[NSMutableArray array];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if (idx % width == 0) {
            [mArray addObject:[NSMutableArray array]];
        }
        [[mArray objectAtIndex:[mArray count]-1] addObject:obj];
    }];

    return mArray;

}

@end

你会像这样使用它:

NSArray *numbers = [@[@1, @2, @3, @4 ,@5, @6, @7] arrayOfArraysWithColumnWidth:3];
于 2013-01-30T08:23:30.237 回答