1

配列をループして、この配列のオブジェクト タグ プロパティを別の配列のオブジェクトと比較しています。

これが私のコードです:

NSArray *objectsArray = ...;
NSArray *anotherObjectArray = ...;
NSMutableArray *mutableArray = ...;

for (ObjectA *objectA in objectsArray) {
    for (ObjectZ *objectZ in anotherObjectArray) {
        if ([objectA.tag isEqualToString:objectZ.tag]) {
            [mutableArray addObject:objectA];
        }
    }
}

これを行うより良い方法はありますか?

tagプロパティは整数ではないため、文字列を比較する必要があることに注意してください。

4

4 に答える 4

5

これを行うには、ネストするのではなく、各配列を 1 回反復処理します。

NSMutableSet *tagSet = [NSMutableSet setWithCapacity:[anotherObjectArray count]];

for(ObjectZ *objectZ in antherObjectArray) {
    [tagSet addObject:objectZ.tag];
}

NSMutableArray *output = [NSMutableArray mutableArray];

for(ObjectA *objectA in objectsArray) {
    if([tagSet containsObject:objectA.tag]) {
        [output addObject:objectA];
    }
}
于 2011-09-26T16:56:18.013 に答える
1

最も単純な変更 (objectA ごとに 1 つの一致しかないため) では、[mutableArray addObject:objectA] の後にブレークを行うことができます。一致が発生すると、内側のループが 50% 削減されます。

さらに劇的なことに、これを頻繁に行っていて、anotherObjectArray の順序が問題にならない場合は、anotherObjectArray データ構造を逆にして辞書を使用し、オブジェクトをタグごとに格納します。次に、objectA を反復処理して、そのタグが ObjectZs の辞書にあるかどうかを尋ねます。

于 2011-09-26T16:57:44.300 に答える
1

[NSArrayfilteredArrayUsingPredicate:]; を使用できるかもしれません。- http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

ただし、プロパティ タグを自分で調整する必要がある場合があります。

NSArray *objectsArray = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];
NSArray *tagsArray = [NSArray arrayWithObjects:@"Miguel", @"Adam", nil];

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", tagsArray];
NSArray *results = [objectsArray filteredArrayUsingPredicate:sPredicate];
NSLog(@"Matched %d", [results count]);
for (id a in results) {
    NSLog(@"Object is %@", a);
}

お役に立てれば

于 2011-09-26T17:12:10.987 に答える
0

すべての答えをありがとう。NSMutableSetソリューションを受け入れましたが、実際には次のようになりました。これは、少し高速であることが判明したためです。

NSMutableDictionary *tagDictionary = [NSMutableDictionary dictionaryWithCapacity:[anotherObjectArray count]];
for (ObjectZ *objectZ in anotherObjectArray) {
    [tagDictionary setObject:objectZ.tag forKey:objectZ.tag];
    }
for (ObjectA *objectA in objectsArray) {
    if ([tagDictionary objectForKey:objectA.tag]) {
        [direction addObject:objectA];
    }
}
于 2011-09-26T20:07:39.990 に答える