比较2个数组,删除具有相同字段的元素

时间:2010-09-27 01:44:37

标签: iphone objective-c


 这是我的问题, 我有5000个数组,我想删除array4999中与array5000名称相同的元素,然后添加到array5000。 NewArray1说出一个新阵列。然后从array4998中删除相同的名称元素,并出现NewArray2。迭代地说,直到所有5000个数组都使用过滤器并且只留下一个新数组,其中没有重复的名称。

我打算做的是如下例, 说出Entity个对象的数组:

@interface Entity : NSObject  {
     NSString *firstName;
     NSString *lastName;
     NSNumber *nid;
     object1;
        .
        .
        .
     objectN
}

我想在三个关键字段上比较这两个数组:firstNamelastNamenid(我不关心其他字段)。如果array5000和array4999中的元素在这3个字段中相同,则在将其添加到array5000之前删除array4999中的相应元素。生成的NewArray1应如下例所示:

array5000 = {"Tom","Jackson",235,....},
         {"Dick","Martin",360,....},
         {"Jimmy","Green",568,....}
array4999 = {"John","Mouson",125,....},
         {"Dick","Martin",360,....}  

NewArray1= {"Tom","Jackson",235,....},
         {"Dick","Martin",360,....},
         {"Jimmy","Green",568,....}
         {"John","Mouson",125,....};

我发现了一个方法- (void)removeObjectsInArray:(NSArray *)otherArray,它接近我的需要,但只有当这些元素与接收方中的相应元素完全相同时,此方法才会删除otherArray中的元素。对我而言,如果firstNamelastNamenid字段相同,我只想删除元素。     我想在array4999中过滤具有相同名称的元素,然后将其添加到array5000以获取NewArray1。接下来,过滤array4998。删除名称与NewArray1相同的元素,然后合并NewArray1和array4998以获取NewArray2。按递减计数逐个过滤,直到完成所有5000个数组。 由于性能是一个问题,任何人都可以给我一些关于我的问题的想法吗?一些代码示例将不胜感激 提前谢谢。

2 个答案:

答案 0 :(得分:0)

绝对最简单的方法是使用嵌套循环,如下所示:

NSMutableArray * array3 = [[array1 mutableCopy] autorelease];
for (Entity * entity2 in array2) {
    BOOL noMatchFound = TRUE;
    for (Entity * entity1 in array1) {
        if ([entity1.firstName isEqual:entity2.firstName] &&
              [entity1.lastName  isEqual:entity2.lastName] &&
              [entity1.nid       isEqual:entity2.nid) {
            noMatchFound = FALSE;
            break;
        }
    }
    if (noMatchFound) {
        [array3 addObject:entity2];
    }
}

生成的array3现在将包含array1中的所有原始实体,以及array2中不匹配的任何实体具有相同的firstNamelastNamenid属性。

请注意,此代码假定Entity类对所有三个关键字段都有@property个定义。

答案 1 :(得分:0)

你可以做的一件事是:

  • 首先在您的实体上定义一个-compositeKey方法,该方法返回一个组合了您唯一性检查所关注的所有字段的单个键

  • 使用复合键作为字典键,将每个数组中的所有实体插入到单个字典中

  • 使用-allValues

  • 从字典中提取结果数组

例如:

NSMutableDictionary *uniqueResults = [NSMutableDictionary dictionary];

for (NSArray *curArray in allArrays) {
    for (Entity *entity in curArray) {
        if ([uniqueResults objectForKey:[entity compositeKey]] == nil) {
             [uniqueResults setObject:entity forKey:[entity compositeKey]];
        }
    }
}

NSArray *resultArray = [uniqueResults allValues];

通过利用NSDictionary哈希表实现,你会比O(n ^ 2)做得更好