カスタムオブジェクトの配列が2つあります。どちらにもNSString*nameのプロパティがあります。確認したい
object.name in array1 == object.name in array2
どうすればいいですか?述語を作成する必要がありますか?私はそれを総当たり攻撃し、array2のオブジェクトを列挙して、同じ名前であるかどうかを確認できることを知っていますが、このタスクを実行するためのより優れた、または理想的な方法があるかどうかはわかりませんでした。ありがとう。
カスタムオブジェクトの配列が2つあります。どちらにもNSString*nameのプロパティがあります。確認したい
object.name in array1 == object.name in array2
どうすればいいですか?述語を作成する必要がありますか?私はそれを総当たり攻撃し、array2のオブジェクトを列挙して、同じ名前であるかどうかを確認できることを知っていますが、このタスクを実行するためのより優れた、または理想的な方法があるかどうかはわかりませんでした。ありがとう。
あなたが考えていることは大丈夫です。型を知っている範囲で、コンパイラーと将来コードを読む人に明確になるように型を指定してください。また、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];
}
そして同様にバーのために。
NSMutableSetのintersectSet:
メソッドを使用します。
交差させたいプロパティ値の配列を引き出し、最初の配列を可変セットに変換します。NSMutableSet *setA = [NSMutableSet setWithArray:[arrayA valueForKey:@"name"]];
配列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
ます。
述語を使用する場合でも、内部的には配列内の各オブジェクトを取得して比較します。配列はcollection
プリミティブデータ型とは異なり、1回のフライで比較する方法はありません。