2016-07-14 5 views
3

私はiOSアプリケーションを開発しています。ここでは、サーバーからJSONオブジェクトを取得します。これはUITableViewに配置されます。2つのNSDictionariesとFind Differenceの比較

ユーザーはtableviewの値を変更できます。その結果、新しいJSONが作成されます。 今、デルタ(2つのJSONオブジェクトの違い)をサーバーに送り返したいと思います。 デルタを見つけるために両方のオブジェクトをトラバースすることができます。しかし、ちょうどこの問題のための簡単な解決策があることを知りたいです。

例:新しい価値を考慮し

NSDictionary *dict1 = {@"Name" : "John", @"Deptt" : @"IT"}; 
NSDictionary *dict2 = {@"Name" : "Mary", @"Deptt" : @"IT"}; 

Delta = {@"Name" : "Mary"} 

は、キー名のメアリーです。ここアドバンス

+0

ジョンと比べると、メアリーはどうやって取るのですか? –

+0

比較辞書の[このリンク](http://rypress.com/tutorials/objective-c/data-types/nsdictionary)にチェックを入れてください。あなたの辞書がキーの点で同じならば、単にforループを実行し、 'dict1'のキーの値を' dict2'と比較することができます。 – Adrian

答えて

2

おかげで、一致しない値を持つすべてのキーを取得する方法です。そこ

NSMutableDictionary *result = [@{} mutableCopy]; 

// notice that this will neglect keys in dict2 which are not in dict1 
for (NSString *key in [dict1 allKeys]) { 
    id value1 = dict1[key]; 
    id value2 = dict2[key]; 
    if (![value1 equals:value2]) { 
     // since the values might be mismatched because value2 is nil 
     value2 = (value2)? value2 : [NSNull null]; 
     result[key] = @[value1, value2]; 
    } 
} 

// for keys in dict2 that we didn't check because they're not in dict1 
NSMutableSet *set1 = [NSMutableSet setWithArray:[dict1 allKeys]]; 
NSMutableSet *set2 = [NSMutableSet setWithArray:[dict2 allKeys]]; 

for (NSString *key in [set2 minusSet:set1]) { 
    result[key] = @[[NSNull null], dict2[key]]; 
} 

:どのようなこれらのキーを行うには、アプリケーション・レベルの質問ですが、最も有益な構造は、両方の辞書からの不一致の値の配列が含まれるであろう、同様に他に存在しない一つのキーを処理しています確かにより経済的な方法ですが、このコードは命令に最適化されています。

+1

これは、変更可能な辞書を作成する興味深い方法です。 – Droppy

1

isEqualToDictionary:受信する辞書の内容が他の指定された辞書の内容と等しいかどうかを示すブール値を返します。彼らそれぞれが同じ数のエントリを保持する場合

if ([NSDictionary1 isEqualToDictionary:NSDictionary2) { 
    NSLog(@"The two dictionaries are equal."); 
} 

2つの辞書は、同じコンテンツを有しており、所定のキーのため、各辞書の対応する値オブジェクトはisEqual:テストを満たします。

+0

これは何も答えません。デルタが存在する場合、@Yuktaはbooleanではなくdeltaを求めました。 – raistlin