比较两个 NSArray 的自定义对象并列出这些数组中的不同对象的更好方法
Better way to compare custom objects of two NSArray and list out distinct objects in those array's
我有一个名为 car 的模型对象,它具有以下属性
- 姓名
- 颜色
- 类型
在一个数组(名称:oldArray)中,我有几个汽车对象。在一个常见的间隔中,我将点击一个 API 并获得另一个包含多个汽车对象的数组(名称:newArray)。我需要比较两个数组并获取唯一项的列表并将其显示给用户。
条件。
1. 如果 newArray 中的对象不在 oldArray 中,那么我需要通知用户他有一辆新车以及车名
2. 如果 oldArray 中的对象不在 newArray 中,那么我需要通知用户他已经卖掉了他的车以及车名
我创建了以下方法
- (NSMutableArray *)getModifiedUserCarsFrom:(NSMutableArray *)savedCars NewCars:(NSMutableArray *)newCars {
NSMutableArray *loopArray1;
NSMutableArray *loopArray2;
NSMutableArray *modifiedCars = [NSMutableArray array];
if (newCars.count >= savedCars.count) {
loopArray1 = newCars;
loopArray2 = savedCars;
} else {
loopArray1 = savedCars;
loopArray2 = newCars;
}
for (Car *old in loopArray1) {
BOOL isCarExist = NO;
for (Car *new in loopArray2) {
if ([new.name isEqualToString:old.name]) {
isCarExist = YES;
break;
}
}
if (!isCarExist) {
[modifiedCars addObject:olde];
}
}
return modifiedCars;
}
还有比这更好更快的方法吗?
感谢任何意见和建议。
使用下面的代码,
它的第一个数组(savedCars)与第二个数组(newCars)中的相同对象,如果您使用下面的代码,它会自动删除第一个数组(savedCars)中的相同对象。
[savedCars removeObjectsInArray: newCars];
希望对您有所帮助
//Create NSSet from Array
NSSet* oldset = [NSSet setWithArray:oldArray];
NSSet* newset = [NSSet setWithArray:newArray];
// retrieve the Name of the objects in newset
NSSet* newset_names = [newset valueForKey:@"Name"];
// only keep the objects of oldset whose 'Name' are not in newset_names
NSSet* oldset_minus_newset = [oldset filteredSetUsingPredicate:
[NSPredicate predicateWithFormat:@"NOT Name IN %@",newset_names]];
//And Same can be used for find newset not have name in oldset
// retrieve the Name of the objects in oldset
NSSet* oldset_names = [oldset valueForKey:@"Name"];
// only keep the objects of newset whose 'Name' are not in oldset_names
NSSet* new_minus_oldset = [newset filteredSetUsingPredicate:
[NSPredicate predicateWithFormat:@"NOT Name IN %@",oldset_names]];
//Now convert back to Array from sets
NSArray *new_minus_oldArray = [new_minus_oldset allObjects];
NSSet* oldset_minus_newArray = [oldset_minus_newset allObjects];
我有一个名为 car 的模型对象,它具有以下属性
- 姓名
- 颜色
- 类型
在一个数组(名称:oldArray)中,我有几个汽车对象。在一个常见的间隔中,我将点击一个 API 并获得另一个包含多个汽车对象的数组(名称:newArray)。我需要比较两个数组并获取唯一项的列表并将其显示给用户。
条件。 1. 如果 newArray 中的对象不在 oldArray 中,那么我需要通知用户他有一辆新车以及车名 2. 如果 oldArray 中的对象不在 newArray 中,那么我需要通知用户他已经卖掉了他的车以及车名
我创建了以下方法
- (NSMutableArray *)getModifiedUserCarsFrom:(NSMutableArray *)savedCars NewCars:(NSMutableArray *)newCars {
NSMutableArray *loopArray1;
NSMutableArray *loopArray2;
NSMutableArray *modifiedCars = [NSMutableArray array];
if (newCars.count >= savedCars.count) {
loopArray1 = newCars;
loopArray2 = savedCars;
} else {
loopArray1 = savedCars;
loopArray2 = newCars;
}
for (Car *old in loopArray1) {
BOOL isCarExist = NO;
for (Car *new in loopArray2) {
if ([new.name isEqualToString:old.name]) {
isCarExist = YES;
break;
}
}
if (!isCarExist) {
[modifiedCars addObject:olde];
}
}
return modifiedCars;
}
还有比这更好更快的方法吗? 感谢任何意见和建议。
使用下面的代码,
它的第一个数组(savedCars)与第二个数组(newCars)中的相同对象,如果您使用下面的代码,它会自动删除第一个数组(savedCars)中的相同对象。
[savedCars removeObjectsInArray: newCars];
希望对您有所帮助
//Create NSSet from Array
NSSet* oldset = [NSSet setWithArray:oldArray];
NSSet* newset = [NSSet setWithArray:newArray];
// retrieve the Name of the objects in newset
NSSet* newset_names = [newset valueForKey:@"Name"];
// only keep the objects of oldset whose 'Name' are not in newset_names
NSSet* oldset_minus_newset = [oldset filteredSetUsingPredicate:
[NSPredicate predicateWithFormat:@"NOT Name IN %@",newset_names]];
//And Same can be used for find newset not have name in oldset
// retrieve the Name of the objects in oldset
NSSet* oldset_names = [oldset valueForKey:@"Name"];
// only keep the objects of newset whose 'Name' are not in oldset_names
NSSet* new_minus_oldset = [newset filteredSetUsingPredicate:
[NSPredicate predicateWithFormat:@"NOT Name IN %@",oldset_names]];
//Now convert back to Array from sets
NSArray *new_minus_oldArray = [new_minus_oldset allObjects];
NSSet* oldset_minus_newArray = [oldset_minus_newset allObjects];