2011-07-10 7 views
2

[NSArray indexOfObject:NSString]を使用して、1項目の検索のインデックスを取得できます。しかし、私の検索から返されたインデックスの配列を取得するために、私は何を使うことができますか?あなたはiOSの以前のバージョンをサポートする必要がある場合は、ブロックのためのindexOfObjectのようなものを使ってNSArrayのインデックスを取得する方法は?

// a single element to search for 
id target; 
// multiple elements to search for 
NSArray *targets; 
... 
// every index of the repeating element 'target' 
NSIndexSet *targetIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) { 
     return [obj isEqual:target]; 
    }]; 

// every index of every element of 'targets' 
NSIndexSet *targetsIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) { 
     return [targets containsObject:obj]; 
    }]; 

サポートは、iOS 4で追加された、indexesOfObjectsPassingTest:ではありません。

おかげ

+0

配列内で繰り返される可能性のある要素を検索するか、複数の要素を一度に検索しますか? – outis

+0

私は1000 NSStringのNSArrayを持っています。NSStringは1つの特定のNSStringを検索しており、複数のインデックスを返すことがあります。 –

+0

http://stackoverflow.com/questions/905828/get-nsindexset-from-nsarray –

答えて

6

は、複数のインデックスを取得するには、indexesOfObjectsPassingTest:を使用することができますオプション。代わりに、あなた自身の方法をロールバックするindexOfObject:inRange:を使用することができます。

@interface NSArray (indexesOfObject) 
-(NSIndexSet *)indexesOfObject:(id)target; 
@end 

@implementation NSArray (indexesOfObject) 
-(NSIndexSet *)indexesOfObject:(id)target { 
    NSRange range = NSMakeRange(0, [self count]); 
    NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init]; 
    NSUInteger idx; 
    while (range.length && NSNotFound != (idx = [self indexOfObject:target inRange:range])) { 
     [indexes addIndex: idx]; 
     range.length -= idx + 1 - range.location; 
     range.location = idx + 1; 
    } 
    return [indexes autorelease]; 
} 
@end 
+0

ありがとう –

1

あなたは、indexOfObjectsPassingTestへのアクセスを持っていない@outisが推奨するように、あなたが後に起動する範囲を更新し、結果の上にindexOfObject:inRange:とループを使用することができれば最後の結果が終了し、結果を独自のNSIndexSetまたはNSMutableArrayなどに更新します。

関連する問題