2

我有这样NSMutableArray的对象:“0,1,0,1,1,1,0,0”

我需要获取所有值为“1”的对象的索引

我正在尝试使用以下代码来获取它:

for (NSString *substr in activeItems){
            if ([substr isEqualToString:@"1"]){
                NSLog(@"%u",[activeItems indexOfObject:substr]);   
            }
    }

但正如它在文档方法中所说的indexOfObject:“返回 - 对应数组值等于 anObject 的最低索引。”

问题:如何获取值为“1”的数组的所有索引?

4

3 回答 3

5

您可以使用以下方法NSArray

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate

文档在这里。

NSIndexSet *set = [array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return [obj isEqualToString:@"1"];
}];

这就是如何将索引作为数组元素(由NSNumber对象表示)的方式:

NSIndexSet *set = // obtain the index set as above

NSUInteger size = set.count;

NSUInteger *buf = malloc(sizeof(*buf) * size);
[set getIndexes:buf maxCount:size inIndexRange:NULL];

NSMutableArray *array = [NSMutableArray array];

NSUInteger i;
for (i = 0; i < size; i++) {
    [array addObject:[NSNumber numberWithUnsignedInteger:buf[i]]];
}

free(buf);

然后将包含包装在sarray中的匹配对象的所有索引。NSNumber

于 2013-01-20T12:01:35.620 回答
4

只需使用 NSArray 的indexOfObjectsPassingTest:方法,提供一个块作为参数来检查您的对象。

它将返回一个 NSIndexSet。

- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate

然后从NSIndexSet,

[indexset enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
      //idx is what you want!
}];
于 2013-01-20T12:00:03.853 回答
4

您可以使用[NSArray indexesOfObjectsPassingTest:]参考):

NSIndexSet *indexes = [activeItems indexesOfObjectsPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
    return [obj isEqualToString:@"1"];
}];

[NSArray objectsAtIndexes:]获得索引后,您可以使用( reference )获取原始数组的子集,其中仅包含您感兴趣的对象:

NSArray *subset = [activeItems objectsAtIndexes:indexes];
于 2013-01-20T12:00:56.780 回答