0

最初のNSDictionaryにはないが、2番目にはあるオブジェクトをフェッチするにはどうすればよいですか?以下のアプローチは私に同じオブジェクトを数回与えます

  for (NSString *numCodetmp in numCodeForInsertingRow) {
                for (NSString *numCodeInsertmp in numCode) 
                   if (![numCodetmp  isEqualToString:numCodeInsertmp])
                       NSLog(@"Equal : %@, %@ ",numCodetmp,numCodeInsertmp);
            }
4

5 に答える 5

1

したがって、前のように for ループをネストすると、内側の for ループの反復が完了するたびに、外側の forループが1 回実行されることに注意してください。次に、if ステートメントは NSLog ステートメントの反対をチェックします。if ステートメントは numCodeTmp を numCodeInsertmp と比較し、それらが等しいかどうかを示す bool を返します。次に、その結​​果を反転し、それが true と評価されるかどうかを確認します。したがって、2 つが等しくない場合 (これは true と評価されます...紛らわしいですが、私は知っています)、Equal : %@, %@ を出力します。「!」を削除するつもりだったと思います。

では、より大きな問題について説明します。ディクショナリ内のオブジェクトを比較している場合は、その特定のオブジェクトにアクセスするためのキーを与える必要があります。上記のコードから numCodeForInsertingRow と numCode が何であるかはわかりませんが、それらが辞書である場合、それらからオブジェクトを正しく取得していません。文字列を比較するだけの場合は、NSSet を比較する方が違いを簡単に確認できます。文字列が辞書内のオブジェクトのキーであり、それが比較対象である場合は、次のいずれかを行う必要があります

  1. [dict allKeys] を使用してキーの配列を作成し、その方法で for ループを実行します。これは、Obj1 が Dict1 と Dict2 に存在する場合、Key1 は両方で同じであると想定しています。
  2. 各ディクショナリの特定のキーのオブジェクトの配列を作成します。[dict1Array カウント] > 0 && [dict2Array カウント] > 0 の場合、オブジェクトは両方の辞書に存在します。

比較する方法は他にもたくさんありますが、NSSet と上記の 2 点はほんの一例です。

于 2012-04-04T17:17:56.570 に答える
0

allKeysメソッドを使用して、2番目のディクショナリからすべてのキーを取得します。

使う

for (object in dictionary) 

これらのキーをループするforループのスタイル。

各キーを順番に使用して、他のディクショナリにそのキーを持つオブジェクトがあるかどうかを確認します。(objectForKeyを使用)。特定のキーが他の辞書に存在しない場合、それはあなたが探しているアイテムの1つです。

keysOfEntriesPassingTestメソッドを使用するという他の投稿者のアイデアもおそらく機能しますが、ブロックに慣れていない場合は、実装が少し混乱する可能性があります。

于 2012-04-04T20:44:23.117 に答える
0

// NSMutableDictionary オブジェクトがあり、キー値が比較に使用できる PK であると仮定します。

for (NSString *firstSetKey in firstSet)
{
     [secondSet removeOjbectForKey:firstSetKey];
} 
于 2012-11-09T00:35:24.287 に答える
0

私は次のようにします:

NSArray *keys = [dictionary allKeys];

for (int i = 0; i < keys.count; i++)
{
    for (int j = i + 1; j < keys.count; j++)
    {
         if ([[keys objectAtIndex:i] isEqual:[keysObjectAtIndex:j]])
         {
             // insert code here
         }
    }
}

これには、キーを相互に比較したり、複数回比較したりしないという利点があり、パフォーマンスが向上します。

于 2012-04-04T20:54:30.920 に答える
0

おそらく、 keysOfEntriesPassingTest:メソッドを使用できますか? 何かのようなもの:

NSSet *keysInDictTwoOnly;
keysInDictTwoOnly = [secondDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop){
    return ([firstDict objectForKey:key] != obj);
}];

つまり、キーが存在しkeysInDictTwoOnlyない場合、firstDictまたはこのキーの下にあるオブジェクトがこのキーfirstDictの下にあるオブジェクトと同じでない場合、キーは存在しsecondDictます。

于 2012-04-04T17:28:45.540 に答える