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:「returns-対応する配列値が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のindexesOfObjectsPassingTest:メソッドを使用して、オブジェクトをチェックするための引数としてブロックを指定するだけです。

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:]参照)を使用して、関心のあるオブジェクトのみを含む元の配列のサブセットを取得できます。

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