如果可以的话,许多答案只会建议使用其他一些推荐的数据结构。但是假设你有这样一个数组并且需要这样做并不难。您可以将数组处理为两个 - 可能需要大量复制;或者您可以简单地查看数组 - 它会在访问时间上花费一点点时间来进行复制。这里JASArray
绝对没有检查代码(留给你):
@interface JASArray : NSArray
- (id) initWith:(NSArray *)baseArray jumpTo:(NSUInteger)jumpTo strideBy:(NSUInteger)strideBy;
@end
要覆盖NSArray
您只需要实现count
and 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
)
高温高压