がNSArray
あり、配列から新しい配列に引き出す必要のある要素を(バイナリで)表す整数のリストを計算しました。
たとえば、7、11、および13があり、そのビットパターンは、、、000111
および001011
です001101
。メイン配列から要素0、1、2、要素0、1、3、0、2、3の3つの配列を取得したいと思います。
がNSArray
あり、配列から新しい配列に引き出す必要のある要素を(バイナリで)表す整数のリストを計算しました。
たとえば、7、11、および13があり、そのビットパターンは、、、000111
および001011
です001101
。メイン配列から要素0、1、2、要素0、1、3、0、2、3の3つの配列を取得したいと思います。
NSIndexSet
あなたが持っているビットパターンからを構築します:
@implementation NSIndexSet (NonContiguous)
+ (instancetype)indexSetFromMask:(NSUInteger)mask
{
NSMutableIndexSet * set = [NSMutableIndexSet indexSet];
for( NSUInteger i = 0; i < (sizeof(NSUInteger) * 8); i++ ){
if( mask & (1l << i) ){
[set addIndex:i];
}
}
return set;
}
@end
次に、objectsAtIndexes:
[origArray objectsAtIndexes:[NSIndexSet indexSetFromMask:7]];
// etc.
たとえば、出力を[[a、b、c]、[a、b、d]、[a、c、d]]の形式にする場合は、次のようになります。
NSArray *sourceArray = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",@"d",...,nil];
NSArray *grabArray = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:11],[NSNumber numberWithInt:13],...,nil];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
次に、grabArrayの各要素について、正しい要素をresultArrayに追加します。
for (NSNumber num in grabArray) {
int n = [num intValue];
int bit = floor(log2(n)); //get highest bit in the current number
NSMutableArray *curr = [[NSMutableArray alloc] init];
while (n>0) {
if (n>pow(bit,2)) { //if this bit is a 1
[curr addObject:[sourceArray objectAtIndex:bit]];
}
n-=pow(bit,2);
bit-=1;
}
[resultArray addObject:curr];
}
その場合、resultArrayは探している配列になります。オブジェクトは逆の順序で追加されるため、順序が重要な場合は、[curr insertObject: [sourceArray objectAtIndex:bit] atIndex:0];
代わりに使用することをお勧めします。