比较并获取存储在两个NSDictionary中的对象

时间:2012-04-04 16:53:31

标签: ios ios5 ios4 nsdictionary

我如何获取不在第一个NSDictionary中的对象,但是在第二个?下面的方法多次给我相同的对象

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

5 个答案:

答案 0 :(得分:1)

所以,要意识到当你像你一样为循环嵌套时,对于内部for循环的每次完整迭代,forter循环都会执行一次。其次,if语句检查与NSLog语句相反的内容。你的if语句将numCodeTmp与numCodeInsertmp进行比较,并返回一个bool,说明它们是否相等。然后,您反转该结果并检查该计算结果是否为true。因此,你要说两者是否相等(这将评估为真...令人困惑,我知道),打印Equal:%@,%@。我假设你打算删除“!”。

好的,现在是更大的问题。如果要比较字典中的对象,则必须为其提供访问该特定对象的密钥。我不知道你上面提供的代码中有哪些numCodeForInsertingRow和numCode,但是如果它们是字典,你就不会正确地抓取它们中的对象。如果您只是比较字符串,比较NSSets将是检查差异的更简单方法。如果字符串是字典中对象的键,那就是你要比较的东西,你需要

  1. 使用[dict allKeys]创建一个键数组,然后以这种方式运行for循环。这假设如果在Dict1和Dict2中存在Obj1,则Key1在两者中都是相同的。
  2. 为每个字典创建特定键的对象数组。如果[dict1Array count]> 0&& [dict2Array count]> 0,该对象存在于两个词典中
  3. 还有很多其他的比较方法,但NSSet和上面两点只是几个例子。

答案 1 :(得分:0)

也许您可以使用keysOfEntriesPassingTest:方法?类似的东西:

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

即如果密钥不在keysInDictTwoOnly中,则密钥在firstDict中,否则此密钥下的firstDict中的对象与{{1}中的对象不同在这把钥匙下。

答案 2 :(得分:0)

使用allKeys方法从第二个字典中获取所有密钥。

使用

for (object in dictionary) 

for循环的样式循环遍历这些键。

依次使用每个键来查看另一个词典中是否存在具有该键的对象。 (使用objectForKey)。如果另一个字典中不存在给定的键,那么这就是您要查找的项目之一。

另一张海报使用keysOfEntriesPassingTest方法的想法可能也会起作用,但如果你对块感到不舒服,可能会有点混乱。

答案 3 :(得分: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
         }
    }
}

这样做的好处是不会相互比较密钥,也不会多次比较,以及提高性能。

答案 4 :(得分:0)

//假设您有NSMutableDictionary对象,并且键值是可用于比较的PK:

for (NSString *firstSetKey in firstSet)
{
     [secondSet removeOjbectForKey:firstSetKey];
}