比较两个 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];