多くの回答は、可能であれば推奨される他のデータ構造を使用することを提案するだけです。しかし、そのような配列があり、これを行う必要があると仮定すると、難しくありません。配列を 2 つに処理できます。大量のコピーが発生する可能性があります。または、単に配列のビューを取得することもできます-これは、コピーのアクセス時間のわずかな時間を交換します. JASArray
これはチェックコードがまったくない場合です(それはあなたに任されています):
@interface JASArray : NSArray
- (id) initWith:(NSArray *)baseArray jumpTo:(NSUInteger)jumpTo strideBy:(NSUInteger)strideBy;
@end
オーバーライドNSArray
するには、実装するだけでcount
済みますobjectAtIndex:
:
@implementation JASArray
{
NSUInteger jump;
NSUInteger stride;
NSArray *base;
}
- (id) initWith:(NSArray *)baseArray jumpTo:(NSUInteger)jumpTo strideBy:(NSUInteger)strideBy
{
self = [super init];
if (self)
{
base = baseArray;
jump = jumpTo;
stride = strideBy;
}
return self;
}
- (NSUInteger) count
{
return 1 + (base.count - jump - 1) / stride;
}
- (id) objectAtIndex:(NSUInteger)index
{
return [base objectAtIndex:(jump + index * stride)];
}
@end
テストとして、意図的な不一致のペアに注意してください。
NSArray *array =@[ @"id1", @"name1", @"id2", @"name2", @"id3", @"name3", @"id4" ];
JASArray *ids = [[JASArray alloc] initWith:array jumpTo:0 strideBy:2];
JASArray *names = [[JASArray alloc] initWith:array jumpTo:1 strideBy:2];
NSLog(@"%@\n%@\n%@", array, ids, names);
出力:
JumpAndStride[10480:303] (
id1,
name1,
id2,
name2,
id3,
name3,
id4
)
(
id1,
id2,
id3,
id4
)
(
name1,
name2,
name3
)
HTH