使用NSIndexPath将2D NSArray映射到1D

时间:2012-12-20 20:24:56

标签: objective-c arrays multidimensional-array

我试图像这样使用像2D这样的一维数组,但我无法弄明白。 给定这样的数组:

NSArray *myArray = @[@0,@1,@2,@3,@4,@5];

是否可以使用这样定义的NSIndexPath访问'4'?:

NSIndexPath *index = [NSIndexPath indexPathForRow:1 inSection:1];

3 个答案:

答案 0 :(得分:1)

我想你想做这样的事情:

NSArray* array= @[ @[ @1,@2,@3 ] , @[@2, @4, @6] ];
NSIndexPath* path=[[NSIndexPath alloc]initWithIndexes: (const NSUInteger[]){0,0} length:2];
NSLog(@"%@",array [[path indexAtPosition: 1]] [[path indexAtPosition: 0]]);

答案 1 :(得分:1)

NSArray* myArray= @[ @[ @"Zero.Zero",@"Zero.One",@"Zero.Two" ] , @[ @"One.Zero", @"One.One", @"One.Two" ] ] ;
NSLog(@"%@",  myArray[1][2] ) ;   // logs 'One.Two'

答案 2 :(得分:1)

更一般地说,您可以使用维度A的索引路径来遍历维B的数组。您还可以创建一个规则,说明当您在路径或数组中有额外维度时该怎么做。

该规则可能如下所示:如果我的路径维度不足,则返回路径末尾找到的任何对象。如果我用完了数组维度(就像你问题中的情况那样),请丢弃路径的其余部分并返回我找到的任何非数组。

在代码中:

- (id)objectInArray:(id)array atIndexPath:(NSIndexPath *)path {

    // the end of recursion
    if (![array isKindOfClass:[NSArray self]] || !path.length) return array;

    NSUInteger nextIndex = [path indexAtPosition:0];

    // this will (purposely) raise an exception if the nextIndex is out of bounds
    id nextArray = [array objectAtIndex:nextIndex];

    NSUInteger indexes[27]; // maximum number of dimensions per string theory :)
    [path getIndexes:indexes];
    NSIndexPath *nextPath = [NSIndexPath indexPathWithIndexes:indexes+1 length:path.length-1];

    return [self objectInArray:nextArray atIndexPath:nextPath];
}

这样称呼它......

NSArray *array = [NSArray arrayWithObjects:@1, [NSArray arrayWithObjects:@"hi", @"there", nil], @3, nil];

NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:1];
indexPath = [indexPath indexPathByAddingIndex:1];

NSLog(@"%@", [self objectInArray:array atIndexPath:indexPath]);

这为给定的索引路径生成输出“there”。