3

カスタムオブジェクトの配列が2つあります。どちらにもNSString*nameのプロパティがあります。確認したい

object.name in array1 == object.name in array2

どうすればいいですか?述語を作成する必要がありますか?私はそれを総当たり攻撃し、array2のオブジェクトを列挙して、同じ名前であるかどうかを確認できることを知っていますが、このタスクを実行するためのより優れた、または理想的な方法があるかどうかはわかりませんでした。ありがとう。

4

3 に答える 3

2

あなたが考えていることは大丈夫です。型を知っている範囲で、コンパイラーと将来コードを読む人に明確になるように型を指定してください。また、isEqualToString:を使用して文字列を比較します。

for (Foo *foo in myFooCollection) {
    for (Bar *bar in myBarCollection) {
        if ([foo.name isEqualToString:bar.name]) {
            // match
        }
    }
}

あなたが考えるかもしれないもう一つのことは、比較を実装することです:FooオブジェクトとBarオブジェクトの両方に。

// Foo.m
- (NSComparisonResult)compare:(id)otherObject {
    if ([otherObject isKindOfClass:[Bar self]]) {
        Bar *itsABar = (Bar *)otherObject;
        return [self.name compare:itsABar.name];
    } 
    return [super compare:otherObject];
}

そして同様にバーのために。

于 2012-04-30T17:11:17.370 に答える
2

NSMutableSetのintersectSet:メソッドを使用します。

  1. 交差させたいプロパティ値の配列を引き出し、最初の配列を可変セットに変換します。NSMutableSet *setA = [NSMutableSet setWithArray:[arrayA valueForKey:@"name"]];

  2. 配列Bのプロパティ値と交差させます。[setA intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]];

それを1つの非常に長い行に結合したい場合は、次のようにします。

NSSet *commonProperties = [[NSMutableSet setWithArray:[arrayA valueForKey:@"name"]] intersectSet:[NSSet setWithArray:[arrayB valueForKey:@"name"]]];

もちろん、これはオブジェクト自体ではなく、nameプロパティのみを提供します。オブジェクト全体が必要な場合は、オーバーライドisEqual:して、そこで名前チェックを実行します。次に、パーツを削除してvalueForKey:、2つのセットを交差させることができます。

残りの値は共通の値になります。NSSet文字列の比較では、オブジェクトisEqualToString:の舞台裏を使用しNSStringます。

于 2012-04-30T17:17:15.320 に答える
1

述語を使用する場合でも、内部的には配列内の各オブジェクトを取得して比較します。配列はcollectionプリミティブデータ型とは異なり、1回のフライで比較する方法はありません。

于 2012-04-30T17:15:03.247 に答える