Objective c 将NSMutableArray与NSArray合并,筛选重复项
我有两个数组,一个NSMutableArray和一个NSArray。NSMutableArray是“存储”,它存储来自NSArray源的结果。每5分钟,就会有一个新的NSArray出现,需要对数据进行过滤和排序 按日期排序非常简单,所以我设法按NSDate对NSArray进行排序。排序另一个数组是不必要的,因为它只会导致与用户混淆 我想做的是:NSArray有很多不同的对象,它们都响应-[object name],返回NSString。NSArray需要合并到NSMutableArray中,只需添加新的对象 合并本身没有问题,但性能是有问题的。NSMutableArray最多可以包含3000个项目,NSArray最多可以包含250个项目,尽管通常只有5个或6个项目需要合并到NSMutableArray中 所以,我的问题是:如何在Objective-C中合并两个数组,过滤重复的数组,而不迭代(250*3000)次 汤姆 编辑以澄清某些内容Objective c 将NSMutableArray与NSArray合并,筛选重复项,objective-c,Objective C,我有两个数组,一个NSMutableArray和一个NSArray。NSMutableArray是“存储”,它存储来自NSArray源的结果。每5分钟,就会有一个新的NSArray出现,需要对数据进行过滤和排序 按日期排序非常简单,所以我设法按NSDate对NSArray进行排序。排序另一个数组是不必要的,因为它只会导致与用户混淆 我想做的是:NSArray有很多不同的对象,它们都响应-[object name],返回NSString。NSArray需要合并到NSMutableArray中,只需
“复制”对象是对用户而不是对代码重复的对象。他们的名字相同,但地址不同
更多说明:
@“值”!=@“value”//true
经过编辑,删除了一些愚蠢的东西(尽管留下了很多)
有两种选择:
removeObjectIdenticalTo
从NSMutableArray中删除所有匹配的对象。这需要迭代较小的数组,但正如您所注意到的,它们通常很小。那么addObjectsFromArray
addObject
添加不匹配的对象,在新数组中迭代,查找与indexofobject-dentialto
匹配的对象这两种方法都很昂贵,但可行。您可以使用
NSSet
和NSMutableSet
来代替吗?这可能有助于解决重复问题
编辑:
根据您的评论,除了数组之外,您还可以使用NSSet
快速检查对象成员身份。这需要更多的内存,但如果你不介意的话,它可以让你快速检查。您可以使用NSMutableArray
备份存储,然后使用NSSet
跟踪对象成员身份。您需要保持不变,即NSMutableArray
不包含重复项。您可以使用如下代码:
// Assume that arrayStore is an NSMutableArray * instance variable
// Also, storeSet is an NSMutableSet * ivar
- (void)addObjectsFromArray:(NSArray *)data
{
for (id item in data) {
if (![storeSet member:item]) {
// Will have to keep arrayStore sorted somehow
[arrayStore addObject:item];
[storeSet addObject:item];
}
}
}
您只需遍历NSArray
。我不确定如何实现NSSet
,但检查成员资格并不像检查未排序的数组那样是一个O(n)操作
这不是最有效的方法,但它可以很好地处理现有的方法,只需稍作修改。我可能会首先创建一个新的可变数组,其中包含NSMutableArray和NSArray的内容。然后,根据name属性对新数组进行排序,然后在数组中运行一次,只取出唯一的项。name是数组中存储的对象的属性吗?如果是这样,您可以在将结果添加到可变数组之前,使用相当简单的NSPredicate来过滤不可变数组。下面是一个例子:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE name == %@.name", mutableArray];
resultsArray = [immutableArray filteredArrayUsingPredicate:predicate];
[mutableArray addObjectsFromArray:immutableArray];
可能有很多方法可以显著提高性能,但是为了能够提出建议,我们确实需要更多地了解数组中的对象是什么:它们代表什么?它们是如何使用的?(例如,存储阵列中的项目是否显示在表视图中?)
NSMutableDictionary
,NSMutableSet
等可以与NSMutableArray
相结合,以高效的方式组织和实现模型
例如,假设我们知道对象代表一个人:MDPerson
。一个人有性别、出生日期、姓名、唯一id和一组可以更改的属性。鉴于对对象所代表的更高层次的理解,我们知道只有当两个人的唯一ID相同时,他们才是平等的(换句话说,两个不同的人可以有相同的姓名、性别和出生日期)。假设您的主NSMutableArray
由3000人组成。传入阵列由500人组成,他们已经在主NSMutableArray
中。这500人实例中的一些可能具有“更新”属性,这意味着主阵列中的实例需要使用该信息进行更新
基于这种理解,很明显,主列表应该实现为NSMutableDictionary
,而不是NSMutableArray
。在字典中,个人的唯一id将是键,他们的个人实例将是键的值。然后,您只能在500人的传入阵列中循环一次:
// main dictionary is called personIDsAndPersons
for (MDPerson *person in incomingPersons) {
MDPerson *existingPerson = [personIDsAndPersons objectForKey:[person uniqueID]];
// if nil, the person doesn't exist
if (existingPerson) {
// update the existing person's attributes
[existingPerson setUniqueAttributes:[person uniqueAttributes]];
}
}
同样,我们不知道更多的细节,也不知道物体是什么,我们只是在黑暗中拍摄
您提到两个项目只有在名称相同时才是相同的。那么,这是否意味着3000个对象的主数组中的每个项都有一个唯一的名称?如果是这样,您可以使用NSMutableDictionary
,通过让dictionary中的键为名称,值为对象实例,以高效的方式访问对象。然后,您可以使用一个单独的NSMutableArray
,该数组仅用于显示目的:它允许对存储在NSMutableDictionary
中的相同对象进行有序的组织。请记住,将对象添加到数组或字典时,通常不会创建新副本,而是保留exi
[mutable removeObjectsInArray:newArray];
[mutable addObjectsFromArray:newArray];