2017-05-10 26 views
0

私はXcodeの8.2の午前と異なるNSMutableDictionariesの値を追加し、OSXないのiOS、Objective-Cのは同じキー

のように、私はいくつかの異なるNSMutableDictionariesを持っている:私は方法でそれらを結合する必要が

NSMutableDictionary* dict1 = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
          [NSNumber numberWithInt:1],@"key1", 
          [NSNumber numberWithInt:14],@"key2", 
          nil]; 

NSMutableDictionary* dict2 = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
          [NSNumber numberWithInt:9],@"key1", 
          [NSNumber numberWithInt:1],@"key2", 
          [NSNumber numberWithInt:99],@"key3", 
          nil]; 

// and many more 

私たちは(結果に対するunmutableまたは)新しいNSMutableDictionaryを取得して、一致するキーの値は、上記の例については、このように追加されていること:ここでは

NSMutableDictionary* result = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
          [NSNumber numberWithInt:10],@"key1", // 9+1 
          [NSNumber numberWithInt:15],@"key2", // 14+1 
          [NSNumber numberWithInt:99],@"key3", // stays the same 
          nil]; 
+0

あなたがこれまでに試みられてきましたか? – Shackleford

+0

すべてのキーを繰り返して比較します。しかし、より効果的な何かがあるはずです –

答えて

0

あなたが行く:

NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; 
for (NSDictionary *dictionary in @[dict1, dict2]) { 
    // enumerate the keys and objects in the dictionary 
    [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSNumber *dictionaryNumber, BOOL *stop){ 
     // check if the key exists in result 
     NSNumber *resultNumber = result[key]; 
     if (resultNumber) 
      // the key exists in result, add the number to the existing number 
      result[key] = [NSNumber numberWithInteger:resultNumber.integerValue + dictionaryNumber.integerValue]; 
     else 
      // the key didn't exist in result, add the key and the number to result 
      result[key] = dictionaryNumber; 
    }]; 
} 
+0

それはそれをしました! enumerateKeysAndObjectsUsingBlockについて知らなかった。これはかなり興味深く見え、反復と比較よりもずっと速いようです。ありがとうございました。 –

0

することは、一般的なマージDICです紛争を解決するためのブロックを取っている。

NSDictionary *mergeDictionaries(NSDictionary *left, 
           NSDictionary *right, 
           id (^resolveConflict)(id duplicateKey, id leftValue, id rightValue) 
           ) { 

    NSArray *sharedKeys = [[left allKeys] filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"%@ CONTAINS SELF", [right allKeys]]]; 

    NSMutableArray *leftOnlyKeys = [[left allKeys] mutableCopy]; 
    [leftOnlyKeys removeObjectsInArray: [right allKeys]]; 

    NSMutableArray *rightOnlyKeys = [[right allKeys] mutableCopy]; 
    [rightOnlyKeys removeObjectsInArray: [left allKeys]]; 

    NSMutableDictionary *merged = [[NSMutableDictionary alloc] init]; 

    [leftOnlyKeys enumerateObjectsUsingBlock:^(id _Nonnull key, NSUInteger idx, BOOL * _Nonnull stop) { 
     [merged setObject: left[key] forKey: key]; 
    }]; 

    [rightOnlyKeys enumerateObjectsUsingBlock:^(id _Nonnull key, NSUInteger idx, BOOL * _Nonnull stop) { 
     [merged setObject: right[key] forKey: key]; 
    }]; 

    if(resolveConflict) { 
     [sharedKeys enumerateObjectsUsingBlock:^(id _Nonnull key, NSUInteger idx, BOOL * _Nonnull stop) { 
      id mergedValue = resolveConflict(key, left[key], right[key]); 
      if(nil != mergedValue) { 
       [merged setObject: mergedValue forKey: key]; 
      } 
     }]; 
    } 

    return merged; 
} 

次いで

NSMutableDictionary* dict1 = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithInt:1],@"key1", 
           [NSNumber numberWithInt:14],@"key2", 
           nil]; 

NSMutableDictionary* dict2 = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithInt:9],@"key1", 
           [NSNumber numberWithInt:1],@"key2", 
           [NSNumber numberWithInt:99],@"key3", 
           nil]; 

NSDictionary *merged = mergeDictionaries(dict1, dict2, ^id(NSObject *key, NSNumber *lhs, NSNumber *rhs) { 
    return [NSNumber numberWithInt: ([lhs intValue] + [rhs intValue])]; 
}); 

NSLog(@"result : %@", merged); 

収率

結果:{ KEY1 = 10。key2 = 15; key3 = 99;ここ}

関連する問題