14

私は NSArray を持っていて、それを 2 つの等しい部分に分割したい (「カウント」が奇数の場合は、後者の新しい配列に追加します) - いわば「真ん中に」分割したいのです。

次のコードはまさに私が望んでいることですが、より良い方法はありますか?:

// NOTE: `NSArray testableArray` is an NSArray of objects from a class defined elsewhere;
NSMutableArray *leftArray = [[NSMutableArray alloc] init];  
NSMutableArray *rightArray = [[NSMutableArray alloc] init];

for (int i=0; i < [testableArray count]; i=i+1) {
if (i < [testableArray count]/2) {
        [leftArray addObject:[testableArray objectAtIndex:i]];
    }
    else {
        [rightArray addObject:[testableArray objectAtIndex:i]];
    }
}

leftArray と rightArray が作成されると、それらは変更されないため、「変更可能」である必要はありません。ObjectsAtIndexes メソッドまたはいくつかの高速列挙メソッドを使用して上記のコードを実現する方法があると思いますが、次のコード (または他のバリエーション) を機能させることができません。

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]];
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]];

私がこれで正しい方向に進んでいるか、正しい方向に向けているかを誰かが知っていますか?

ありがとう!

4

3 に答える 3

45

ドキュメント-subarrayWithRange:で詳細に使用するオプションもあります。NSArray

NSArray *firstHalfOfArray;
NSArray *secondHalfOfArray;
NSRange someRange;

someRange.location = 0;
someRange.length = [wholeArray count] / 2;

firstHalfOfArray = [wholeArray subarrayWithRange:someRange];

someRange.location = someRange.length;
someRange.length = [wholeArray count] - someRange.length;

secondHalfOfArray = [wholeArray subarrayWithRange:someRange];

このメソッドは、新しいautorelease-d配列を返します。

于 2009-11-20T03:18:47.783 に答える
2

nilメソッドの最後に追加しようとしました-initWithObjects:か?

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil];
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil];
于 2009-11-20T03:12:26.920 に答える