2

多次元配列にオブジェクトを追加する方法について、私はかなり混乱しています。

多次元配列の初期化は、単純な配列と同じですか?

これが私の初期化です。

testList = [[NSMutableArray alloc] init];

私は次のようなことをする必要があります

testList[i][j] = item;

私は試した

[[[testList objectAtIndex:i]objectAtIndex:j] addObject:item];

しかし、それは機能していないようです:(

4

4 に答える 4

4

これを行うには、多くのCを追加します。これは、NSMutableArrayがどのように機能するか、およびC /C++で知られている2Dアレイと比較してどのように異なるかを知るために重要です。

可変配列では、別の配列を格納できます。例えば:

NSMutableArray *first = [[NSMutableArray alloc] init];
NSMutableArray *second = [[NSMutableArray alloc] init];

[first addObject:second];

これで、最初の配列の最初の行に配列ができました。これは、C / C++2Dアレイに非常によく似ています。

したがって、「0,0」にオブジェクトを追加する場合は、次のようにします。

NSString *mytest = [[NSString alloc] initWithString:@"test"];
[second addObject:mytest];
[first addObject:second];

つまり、2番目にはNSStringが含まれ、最初には2番目が含まれます。これで、これを好きなようにループできます。

----編集: 1,0が必要な場合は、 2番目のNSMutableArrayの別のインスタンスが必要です。たとえば、次の配列があります。

arr

したがって、ここでは2番目の配列に3つの要素があります。

NSMutableArray *first = [[NSMutableArray alloc] init];
for(int i =0 ; i < your_size_condition ; i++) {//if you have size, if don't not a problem, you could use while!
   NSArray *second = [[NSArray alloc] initWithObjects:"@something",@"somethingelse",@"more",nil];
   [first addObject:second];
}

これを行うには、 NSCopyingプロトコルを実装することをお勧めします。

于 2012-07-17T10:27:25.413 に答える
4

固定サイズの配列が必要な場合は、プレーンC配列を使用してください。動的ObjC配列を使用する前に、それを作成する必要があります。

NSMutableArray* array = [NSMutableArray arrayWithCapacity:N];
for(int i=0; i<N; i++) {
    [array addObject:[NSMutableArray arrayWithCapacity:M]];
}

UPD:次のメソッドは、このようなアレイを操作するのに役立つ場合があります。

[[array objectAtIndex:i] addObject:obj];
[[array objectAtIndex:i] insertObject:obj atIndex:j];
[[array objectAtIndex:i] replaceObjectAtIndex:j withObject:obj];
于 2012-07-17T10:27:42.790 に答える
0
[[testList objectAtIndex:i] insertObject:item atIndex:j];
于 2012-07-17T10:46:48.070 に答える
0

@onegrayの答えを拡張するために、いくつかのカテゴリメソッドを設定して、ソフト多次元配列を扱いやすくすることができます。

MultiMutableArray.h

@interface NSMutableArray(MultiMutableArray)
  -(id)objectAtIndex:(int)i subIndex:(int)s;
  -(void)addObject:(id)o toIndex:(int)i;
@end


@implementation NSMutableArray(MultiMutableArray)

MultiMutableArray.m

#import "MultiMutableArray.h"

-(id)objectAtIndex:(int)i subIndex:(int)s
{
    id subArray = [self objectAtIndex:i];
    return [subArray isKindOfClass:NSArray.class] ? [subArray objectAtIndex:s] : nil;
}

-(void)addObject:(id)o toIndex:(int)i
{
    while(self.count <= i)
        [self addObject:NSMutableArray.new];
    NSMutableArray* subArray = [self objectAtIndex:i];
    [subArray addObject: o];
}

@end

例、MultiArrayTests.m

#import <SenTestingKit/SenTestingKit.h>

#import "MultiMutableArray.h"

@interface MultiArrayTests : SenTestCase
@end

@implementation MultiArrayTests

-(void)testMultiArray
{
    NSMutableArray* a = NSMutableArray.new;
    [a addObject:@"0a" toIndex:0];
    [a addObject:@"0b" toIndex:0];
    [a addObject:@"0c" toIndex:0];
    [a addObject:@"1a" toIndex:1];
    [a addObject:@"1b" toIndex:1];
    [a addObject:@"2a" toIndex:2];
    STAssertEquals(a.count, 3U, nil);
    NSMutableArray* a1 = [a objectAtIndex:0];
    NSMutableArray* a2 = [a objectAtIndex:1];
    NSMutableArray* a3 = [a objectAtIndex:2];
    STAssertEquals(a1.count, 3U, nil);
    STAssertEquals(a2.count, 2U, nil);
    STAssertEquals(a3.count, 1U, nil);
}

@end

詳細については、http://peterdeweese.tumblr.com/post/27411932460/soft-multi-dimension-arrays-in-objective-cに書いています。

于 2012-07-17T15:36:13.050 に答える