0

私は要素「1,2,3,4,5,6,7」を持つ1つの1次元配列を渡しています。私のコードでは、この配列を2次元配列に変換したいと考えています。2 次元配列の列数はユーザーによって指定されます。たとえば、列の値を 3 に設定している場合

出力の 2 次元配列は次の形式である必要があります。

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;
}

viewcontroller.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は、指定された列の値を持つ 2 次元配列を指定します。上記のコードは読みやすく、特に簡単な変更を加えたい場合は簡単に維持できます。

出力:

outerArray = (
        (
        1,
        2,
        3
    ),
        (
        4,
        5,
        6
    ),
        (
        7
    )
)
于 2013-01-30T07:47:39.483 に答える
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 スタイルfor( for(int i=0;i<columns;i++)) や高速な列挙を使用するよりも、使用する方が高速であることに注意してください。


ブロックではなく C コンストラクトのみを使用する2 つ目の回答を追加しましたが、これを優先します。


そして - もちろん - 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 に答える
0

私のもう 1 つの回答(私が好むと思います) の次に、従来の 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 に答える