2012-04-30 8 views
3

私は2つのカスタムオブジェクトの配列を持っています。どちらもNSString * nameのプロパティを持っています。私はチェックしたい場合特定のプロパティ、object-cによってオブジェクトが含まれている場合の配列のチェック

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

どうすればいいですか?述語を形成する必要がありますか?私はそれを強制することができ、それが同じ名前を持っているかどうかを調べるためにarray2のオブジェクトを列挙しているだけですが、このタスクを実行するためのより良い実行方法や理想的な方法があるかどうかはわかりませんでした。ありがとう。

+2

あなたが何を意味するかはっきりしません。 array1の各オブジェクトがarray2の同じインデックスにあるオブジェクトと同じ名前かどうか、またはarray1のオブジェクトの名前がarray2のオブジェクトと同じかどうか、または3番目のオプションがあるかどうかをチェックします。 – Chuck

答えて

2

あなたが考えていることは問題ありません。あなたがタイプを知っている限り、コンパイラや将来コードを読んでいる人々には型を明確に指定してください。また、文字列を比較するには、isEqualToString:を使用します。

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

FooオブジェクトとBarオブジェクトの両方でcompare:を実装することも検討してください。

// 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]; 
} 

と同様にバーです。

1

述部を使用しても、内部的には配列内の各オブジェクトを比較して比較します。配列はcollectionで、プリミティブデータ型と似ていないため、シングルフライで比較する方法はありません。

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"]]]; 

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

残りの値は共通の値になります。 NSSet文字列比較ではNSStringオブジェクトの背後でisEqualToString:が使用されています。

関連する問題