2013-02-13 10 views
5

NSMutableArrayには、オブジェクトとしてオブジェクトクラスオブジェクトが含まれています。 これから別のオブジェクトを削除したいと思います。今、私は重複iUserNameを除去することにより、Arrayにのみ2つのオブジェクトをしたいの例iPhone SDKでNSPredicateを使用してNSMutableArrayから別のエンティティオブジェクトを取得

Entity *entity = [[Entity alloc] init]; 
entity.iUserId = 1; 
entity.iUserName = @"Giri" 
[arr addObject:entity]; 

Entity *entity = [[Entity alloc] init]; 
entity.iUserId = 2; 
entity.iUserName = @"Sunil" 
[arr addObject:entity]; 

Entity *entity = [[Entity alloc] init]; 
entity.iUserId = 3; 
entity.iUserName = @"Giri" 
[arr addObject:entity]; 

を次のよう考慮してください。私は反復によって方法を知っているが、私はpredicateまたは他の方法のようにiteratingせずにそれをしたい。 誰かが分かっているなら、私を助けてください。 私は[arr valueForKeyPath:@"distinctUnionOfObjects.iUsername"];を使ってみましたが、それは私に与えられたオブジェクトを返しません。

この質問は以前に質問された質問とはまったく異なります。以前に尋ねられた質問は、別個のオブジェクトを取得することは正しいですが、ループを使用しています&私はこれをしたくありません。私はNSPredicateまたはループを回避する他の簡単なオプションからそれを欲しいです。

+0

"in iphone sdk" - ありがとうございます!誰かがこれを正しく使用してから(これは不適切な "Xcodeを使用する"という用語の代わりに)長い時間がかかりました。 –

+0

私はこの種の質問を3〜4回解決したことを覚えています。だから検索/ Googleに恥ずかしがり屋を感じることはありません。 –

+1

@AKVエンティティクラスオブジェクトからのエンティティを比較することによって、別個の要素が必要です。また、私はforループを避けたい。述語やその他のオプションで可能ですか – Girish

答えて

0

よく考えてみると、いくつかの選択肢があります。

  1. NSArrayの代わりにNSSetを使用します。
  2. forループを使用します(ただし、配列を繰り返し処理したくない場合)
  3. 述語検索iUserNameを使用して配列に追加する前に名前が存在するかどうかを確認します。

ような何か:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iUserName == 'Giri'"]; 
NSArray *searchArray = [arr filterUsingPredicate:predicate]; 
4

EDIT:あなたは手動で配列をループして、新しい配列を構築することなく、あなたがやりたいことはできませんが。以下の答えは、重複が2つしかないと仮定しているので機能しません。

NSMutableArray *filteredArray = [NSMutableArray array]; 

for (Entity *entity in arr) 
{ 
    BOOL hasDuplicate = [[filteredArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"iUserName == %@", entity.iUserName]] count] > 0; 

    if (!hasDuplicate) 
    { 
     [filteredArray addObject:entity]; 
    } 
} 

これは、フィルタリングされた配列内の重複を検索します。

Entityインスタンスを使用すると、一意の識別子として名前を使用するべきではありませんので、良いアイデアではありませんこれは、compareTo:NSOrderedSameを返却しなければならないので、あなたはNSSetを使用することはできません

オリジナル回答を開始します。

述部を使用することはできますが、最適化を行わずにO(n^2)の時間内に配列をループします。

NSArray *filteredArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Entity *evaluatedObject, NSDictionary *bindings) { 
    return [[arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"iUserName == %@", evaluatedObject.iUserName]] count] > 1; 
}]]; 

これは問題なく動作します。 iUserNameプロパティで配列をソートし、並べ替えられた配列をリニアスキャンする(最初の複製が見えるときに停止する)ことで、さらに高速化できます。小さなサンプルサイズ(例えば、1万程度以下)を扱っているなら、それはたくさんの作業です。おそらくあなたの時間の価値はないので、上記のコードを使用してください。

+0

私はあなたのソリューションを試しましたが、うまくいきません。私は以下のコードを使用してNSArray * filteredArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^ BOOL(エンティティ*エンティティ、NSDictionary *バインディング) { return [[arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@ "iUsername ==%@"、exercise .iユーザ名]]]]> 1; }]]; – Girish

+0

それはうまくいくはずです。 –

+0

私の配列には合計14個の要素が含まれています.7個は共通なので、6個の要素を返す必要がありますが、13個の要素を返します。 – Girish

関連する問題