2012-04-04 2 views
0

Как я могу получить объекты, которые не находятся в первом NSDictionary, но находятся во втором? Ниже подход дает мне тот же самый объект несколько разСравнение и выбор объектов, хранящихся в двух NSDictionary

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

ответ

1

Таким образом, понимают, что, когда вы гнездо для петли, как вы сделали, то Outter цикл запускается на выполнение раз для каждой полной итерации внутреннего цикла для. Во-вторых, оператор if проверяет противоположность тому, что говорит инструкция NSLog. Оператор if сравнивает numCodeTmp с numCodeInsertmp и возвращает bool, указав, равны они или нет. Затем вы инвертируете этот результат и проверяете, соответствует ли это true. Таким образом, вы говорите, если эти два НЕ равны (что будет оценивать значение true ... запутанное, я знаю), print Equal:% @,% @. Я предполагаю, что вы хотели удалить «!».

Хорошо, теперь для большей проблемы. Если вы сравниваете объекты в словаре, вы должны предоставить ему ключ для доступа к этому конкретному объекту. Я не могу сказать, какие numCodeForInsertingRow и numCode - из кода, который вы указали выше, но если это словари, вы не правильно извлекаете объекты из них. Если вы просто сравниваете строки, сравнение NSSets было бы более простым способом проверки различий. Если строки ключи для объектов в словаре, и это то, что вы сравниваете, вы должны либо

  1. Создать массив ключей с использованием [Dict AllKeys], а затем запустить для петель таким образом. Это предполагает, что если Obj1 существует в Dict1 и Dict2, Key1 в обоих случаях одинакова.
  2. Создайте массив объектов для определенного ключа для каждого словаря. Если [dict1Array число]> 0 & & [dict2Array число]> 0, то объект существует в обоих словарях

Есть целый ряд других способов сравнения, но NSSet и два пункта выше всего лишь несколько Примеры.

0

Возможно, вы можете использовать метод keysOfEntriesPassingTest:? Что-то вроде:

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

И.Э., ключ находится в keysInDictTwoOnly, если оно либо не firstDict либо объект в firstDict под этим ключом не то же самое, как объект в secondDict под этим ключом.

0

Используйте метод allKeys, чтобы получить все ключи из второго словаря.

Используйте

for (object in dictionary) 

Стиль для петли к петле через эти ключи.

Используйте каждый ключ поочередно, чтобы увидеть, есть ли объект с этим ключом в другом словаре. (используя objectForKey). Если данный ключ не существует в другом словаре, это один из предметов, которые вы ищете.

Идея другого плаката использования метода keysOfEntriesPassingTest, вероятно, тоже будет работать, но это может немного запутать, если вам не нравятся блоки.

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 
     } 
    } 
} 

Это имеет преимущество, не сравнивая ключи друг к другу, а не сравнивая несколько раз, а также повышенную производительность.

0

// при условии, что у вас есть объекты NSMutableDictionary и ключевые значения PKs вы можете использовать для сравнения:

for (NSString *firstSetKey in firstSet) 
{ 
    [secondSet removeOjbectForKey:firstSetKey]; 
} 
Смежные вопросы