1

我有一个名为 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;
}

还有比这更好更快的方法吗?任何意见和建议表示赞赏。

4

2 回答 2

4
//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];
于 2016-05-18T09:30:40.917 回答
1

使用下面的代码,

它的第一个数组(savedCars)第二个数组(newCars)中的相同对象,如果您使用下面的代码,它会自动删除第一个数组(savedCars)中的相同对象。

[savedCars removeObjectsInArray: newCars];

希望它有帮助

于 2016-05-18T09:06:49.643 回答