ios - 比较两个NSArray的自定义对象并列出这些数组的不同对象的更好方法

标签 ios objective-c nsarray ios9.3

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

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

    最佳答案

    //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];
    

    关于ios - 比较两个NSArray的自定义对象并列出这些数组的不同对象的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294634/

    相关文章:

    ios - Xcode 9 错误 : "iPhone has denied the launch request"

    ios - 如何在 Objective C 中按数组元素分组

    ios - 为什么这是 '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array'

    ios - 为自定义 UINavigationBar 设置委托(delegate)

    objective-c - 如何从 NSIndexPath 获取特定值

    ios - http请求登录成功后直接进入swiftUI中的新 View

    ios - Date() 返回 24 小时以上的小时

    ios - 获取列出两个日期范围之间的所有月份和年份

    网络事件上/下/关的 iOS 事件/通知

    iphone - 如何将 NSArray 字符串对象值分配给其他 NSString 变量