0

NSStringオブジェクトの特定の配列を反復処理し、それぞれのプロパティをNSStringを含む別の配列 と比較するためのより優れた効率的な方法を探しています。

私の現在のコードは2つのfor-eachループを使用していますが、それが最も効率的な方法であるとは考えていません。

for (MYClass *foo in arrayOfMyClass) {
    for (NSString *ID in arrayOfStringIDs) {
        if ([foo.Id isEqualToString:ID]) {
            //Do something
            break;
        }
    }
}

いくつかのクールなトリックで少なくとも1つのループをドロップすることはどういうわけか可能であるはずだと思います。

4

3 に答える 3

4

foo.Idに存在するかどうかだけを知りたい場合はarrayOfStringIDs、代わりに文字列のNSSetを使用してください。次に、次のことができます。

NSSet * mySetOfStringIDs = [NSSet setWithArray:arrayOfStringIDs];
for(MyClass * foo in arrayOfMyClass) {
    if([mySetOfStringIDs containsObject:foo.Id]) {
        // Do something
        break;
    }
}

これにより、2番目のループが回避されます。これは、containsObject:一般に、セットのO(n)よりもはるかに高速であるためです。もちろん、必要に応じて独自のプロファイリングを行う必要があります。

于 2012-07-18T21:54:51.820 に答える
1

Nsarrayのindexofobjectメソッドを確認します。nsarrayの文字列のループではなく、インデックスを直接取得するのに役立つ場合があります。

于 2012-07-18T21:50:33.460 に答える
0

arrayOfMyClass両方に存在する文字列の配列を取得する場合は、arrayOfStringIDsKey-Valueコーディングを使用して、文字列のセットを引き出しarrayOfMyClass、結果のセットを。と交差させることができますarrayOfStringIDs。クラスがKVCに準拠している場合は、クラスからすべてのId文字列をセットとして取得できます。

NSMutableSet *idSet=[NSMutableSet setWithArray:[arrayOfMyClass 
   valueForKeyPath:@"@distinctUnionOfObjects.Id"]];
[idSet intersectSet:[NSSet setWithArray:arrayOfStringIDs]];
NSArray *idArray=[idSet allObjects];

残念ながら、2つのを交差させる方法はありません。そのNSArrayため、最初に2つをセットに変換する必要があります。

于 2012-07-19T05:07:07.320 に答える