我有一个NSArray
,并且我计算了一个整数列表,这些整数表示(二进制)我需要从数组中拉出到新数组中的元素。
例如,我有 7、11 和 13,它们的位模式是000111
、001011
和001101
。我想从主数组中抓取三个数组,由元素 0,1,2,然后是元素 0,1,3,然后是 0,2,3 组成。
我有一个NSArray
,并且我计算了一个整数列表,这些整数表示(二进制)我需要从数组中拉出到新数组中的元素。
例如,我有 7、11 和 13,它们的位模式是000111
、001011
和001101
。我想从主数组中抓取三个数组,由元素 0,1,2,然后是元素 0,1,3,然后是 0,2,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];
。