【问题标题】:Selecting array elements using a binary pattern as the selector使用二进制模式作为选择器选择数组元素
【发布时间】:2013-03-13 01:17:44
【问题描述】:

我有一个NSArray,我计算了一个整数列表,这些整数表示(二进制)我需要从数组中拉出到新数组中的元素。

例如,我有 7、11 和 13,其位模式为 000111001011001101。我想从主数组中抓取三个数组,由元素 0,1,2 组成,然后是元素 0,1,3,然后是 0,2,3。

【问题讨论】:

    标签: objective-c cocoa-touch binary nsarray


    【解决方案1】:

    从你拥有的位模式构造一个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.
    

    【讨论】:

    • 由于某种原因,此代码仅正确返回前四个元素。如果数字大于 15,则丢弃所有较高的列。有什么想法吗?
    • 是的,当您在 SO 上发布代码而不运行它甚至重新阅读它时,就会发生这种情况。 sizeof() 是字节数,而不是位数,因此循环终止符需要是 i &lt; (sizeof(NSUInteger) * 8)。当 NSUInteger 为 64 位时,掩码测试中的 1 也需要为 1l。很抱歉!
    【解决方案2】:

    假设您希望输出格式为 [[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];

    【讨论】:

    • 这会返回大量越界索引,它似乎没有捕获所有正确的位。
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2022-07-11
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2011-11-06
    相关资源
    最近更新 更多