这是我的问题,
我有5000个数组,我想删除array4999中与array5000名称相同的元素,然后添加到array5000。 NewArray1说出一个新阵列。然后从array4998中删除相同的名称元素,并出现NewArray2。迭代地说,直到所有5000个数组都使用过滤器并且只留下一个新数组,其中没有重复的名称。
我打算做的是如下例,
说出Entity
个对象的数组:
@interface Entity : NSObject {
NSString *firstName;
NSString *lastName;
NSNumber *nid;
object1;
.
.
.
objectN
}
我想在三个关键字段上比较这两个数组:firstName
,lastName
和nid
(我不关心其他字段)。如果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
中的元素。对我而言,如果firstName
,lastName
和nid
字段相同,我只想删除元素。
我想在array4999中过滤具有相同名称的元素,然后将其添加到array5000以获取NewArray1。接下来,过滤array4998。删除名称与NewArray1相同的元素,然后合并NewArray1和array4998以获取NewArray2。按递减计数逐个过滤,直到完成所有5000个数组。
由于性能是一个问题,任何人都可以给我一些关于我的问题的想法吗?一些代码示例将不胜感激
提前谢谢。
答案 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中不匹配的任何实体具有相同的firstName
,lastName
和nid
属性。
请注意,此代码假定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)做得更好