【问题标题】:NSMutableArray ComparisonNSMutableArray 比较
【发布时间】:2012-08-21 19:37:58
【问题描述】:
我有两个NSMutableArrays。一个数组包含来自数据库的记录,另一个数组包含来自 Web 服务的记录。
我想使用像barcodeID 这样的唯一键将数据库数组中的每条记录与Web 服务数组中的每条记录进行比较。另外,如果barcodeID 键相同,那么我想从数组中删除该项目。这就像我正在更新我的数据库记录。如果我们从 web 服务获得相同的记录,那么我不想插入它们。
请帮帮我,我无法打破这个逻辑。
【问题讨论】:
标签:
iphone
objective-c
collections
nsmutablearray
foundation
【解决方案1】:
如果Product.barcodeID 唯一标识您的对象,那么您可以使用该成员来实现-[Product hash] 和-[Product isEqual:]。
那么您可以在NSSets 中轻松使用Product。 NSSet 和 NSMutableSet 包含几种组合和删除集合的方法。
【解决方案2】:
进行这种比较的蛮力方法是对一个数组中的每条记录与另一个数组中的每条记录进行检查。如果您找到它,则停止并丢弃该对象。如果找不到,则将其添加到数组中。这当然会有非常高的时间复杂度,更糟糕的情况是 O(n^2)。您可以通过在数据库和 Web 服务中使用某些数据结构来缩短此时间。也许按排序顺序或通过某种算法存储它们。
在问这个问题之前,你应该自己做一些研究。我将留给您选择一种方法来优化您的代码。
祝你好运!
【解决方案3】:
这是蛮力方法的一种想法。如上所述,与替代方案相比,这非常慢。
- (void)myUpdateFunction
{
NSMutableArray *baseDatabaseArray;
NSMutableArray *baseWebServiceArray;
for (int i = 0; i < baseWebServiceArray.count; i++) {
id value = [[baseWebServiceArray objectAtIndex:i] valueForKey:@"barcodeID"];
NSArray *array = [baseDatabaseArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"barcodeID = %@", value]];
if (array.count > 0)
{
id obj = [array objectAtIndex:0];
[baseDatabaseArray removeObject:obj];
}
[baseDatabaseArray addObject:[baseWebServiceArray objectAtIndex:i]];
}
}
我一直在使用Magical Record 并喜欢它。
不过,您必须为此使用 Core Data。这是我的更新代码在 Magical Record 中的样子。
- (void)updateDatabase
{
Class class = NSClassFromString(self.managedObjectClassName);
if ([class MR_countOfEntities] > 0) {
for (NSArray *array in self.totalBatches) {
[class MR_updateFromArray:array];
}
} else {
for (NSArray *array in self.totalBatches) {
[class MR_importFromArray:array];
}
}
[self.totalBatches removeAllObjects];
}
如果您对 Core Data 的感觉有任何疑问,或者如果您需要我了解算法,请随时提问。