2016-07-14 156 views
3

我正在研究iOS應用程序,我將從服務器獲取JSON對象,該對象將填充到UITableView上。比較兩個NSDictionaries並查找差異

用戶可以更改tableview的值,因此導致新的JSON。 現在我只想發送增量(差異的兩個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."); 
} 

兩個字典具有相等的內容,如果它們各自持有相同數目的條目,並且對於給定的鍵,在各詞典中的相應值的對象滿足isEqual:測試。

+0

這沒有任何答案。 @Yukta要求增量,如果增量存在,則不是布爾值。 – raistlin