Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将NSMutableArray与NSArray合并,筛选重复项_Objective C - Fatal编程技术网

Objective c 将NSMutableArray与NSArray合并,筛选重复项

Objective c 将NSMutableArray与NSArray合并,筛选重复项,objective-c,Objective C,我有两个数组,一个NSMutableArray和一个NSArray。NSMutableArray是“存储”,它存储来自NSArray源的结果。每5分钟,就会有一个新的NSArray出现,需要对数据进行过滤和排序 按日期排序非常简单,所以我设法按NSDate对NSArray进行排序。排序另一个数组是不必要的,因为它只会导致与用户混淆 我想做的是:NSArray有很多不同的对象,它们都响应-[object name],返回NSString。NSArray需要合并到NSMutableArray中,只需

我有两个数组,一个NSMutableArray和一个NSArray。NSMutableArray是“存储”,它存储来自NSArray源的结果。每5分钟,就会有一个新的NSArray出现,需要对数据进行过滤和排序

按日期排序非常简单,所以我设法按NSDate对NSArray进行排序。排序另一个数组是不必要的,因为它只会导致与用户混淆

我想做的是:NSArray有很多不同的对象,它们都响应-[object name],返回NSString。NSArray需要合并到NSMutableArray中,只需添加新的对象

合并本身没有问题,但性能是有问题的。NSMutableArray最多可以包含3000个项目,NSArray最多可以包含250个项目,尽管通常只有5个或6个项目需要合并到NSMutableArray中

所以,我的问题是:如何在Objective-C中合并两个数组,过滤重复的数组,而不迭代(250*3000)次

汤姆

编辑以澄清某些内容
“复制”对象是对用户而不是对代码重复的对象。他们的名字相同,但地址不同


更多说明:
@“值”!=@“value”//true

经过编辑,删除了一些愚蠢的东西(尽管留下了很多)

有两种选择:

  • 使用
    removeObjectIdenticalTo
    从NSMutableArray中删除所有匹配的对象。这需要迭代较小的数组,但正如您所注意到的,它们通常很小。那么

  • 使用
    addObjectsFromArray

  • 或者。。。实际上,这样做可能会更快:

  • 使用
    addObject
    添加不匹配的对象,在新数组中迭代,查找与
    indexofobject-dentialto
    匹配的对象

  • 这两种方法都很昂贵,但可行。

    您可以使用
    NSSet
    NSMutableSet
    来代替吗?这可能有助于解决重复问题

    编辑:

    根据您的评论,除了数组之外,您还可以使用
    NSSet
    快速检查对象成员身份。这需要更多的内存,但如果你不介意的话,它可以让你快速检查。您可以使用
    NSMutableArray
    备份存储,然后使用
    NSSet
    跟踪对象成员身份。您需要保持不变,即
    NSMutableArray
    不包含重复项。您可以使用如下代码:

    // Assume that arrayStore is an NSMutableArray * instance variable
    // Also, storeSet is an NSMutableSet * ivar
    
    - (void)addObjectsFromArray:(NSArray *)data
    {
        for (id item in data) {
            if (![storeSet member:item]) {
                // Will have to keep arrayStore sorted somehow
                [arrayStore addObject:item];
                [storeSet addObject:item];
            }
        }
    }
    
    您只需遍历
    NSArray
    。我不确定如何实现
    NSSet
    ,但检查成员资格并不像检查未排序的数组那样是一个O(n)操作


    这不是最有效的方法,但它可以很好地处理现有的方法,只需稍作修改。

    我可能会首先创建一个新的可变数组,其中包含NSMutableArray和NSArray的内容。然后,根据name属性对新数组进行排序,然后在数组中运行一次,只取出唯一的项。

    name是数组中存储的对象的属性吗?如果是这样,您可以在将结果添加到可变数组之前,使用相当简单的NSPredicate来过滤不可变数组。下面是一个例子:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE name == %@.name", mutableArray];
    resultsArray = [immutableArray filteredArrayUsingPredicate:predicate];
    [mutableArray addObjectsFromArray:immutableArray];
    

    可能有很多方法可以显著提高性能,但是为了能够提出建议,我们确实需要更多地了解数组中的对象是什么:它们代表什么?它们是如何使用的?(例如,存储阵列中的项目是否显示在表视图中?)

    NSMutableDictionary
    NSMutableSet
    等可以与
    NSMutableArray
    相结合,以高效的方式组织和实现模型

    例如,假设我们知道对象代表一个人:
    MDPerson
    。一个人有性别、出生日期、姓名、唯一id和一组可以更改的属性。鉴于对对象所代表的更高层次的理解,我们知道只有当两个人的唯一ID相同时,他们才是平等的(换句话说,两个不同的人可以有相同的姓名、性别和出生日期)。假设您的主
    NSMutableArray
    由3000人组成。传入阵列由500人组成,他们已经在主
    NSMutableArray
    中。这500人实例中的一些可能具有“更新”属性,这意味着主阵列中的实例需要使用该信息进行更新

    基于这种理解,很明显,主列表应该实现为
    NSMutableDictionary
    ,而不是
    NSMutableArray
    。在字典中,个人的唯一id将是键,他们的个人实例将是键的值。然后,您只能在500人的传入阵列中循环一次:

     // main dictionary is called personIDsAndPersons
    
     for (MDPerson *person in incomingPersons) {
          MDPerson *existingPerson = [personIDsAndPersons objectForKey:[person uniqueID]];
          // if nil, the person doesn't exist
          if (existingPerson) {
              // update the existing person's attributes
              [existingPerson setUniqueAttributes:[person uniqueAttributes]];
          }
     }
    
    同样,我们不知道更多的细节,也不知道物体是什么,我们只是在黑暗中拍摄

    您提到两个项目只有在名称相同时才是相同的。那么,这是否意味着3000个对象的主数组中的每个项都有一个唯一的名称?如果是这样,您可以使用
    NSMutableDictionary
    ,通过让dictionary中的键为名称,值为对象实例,以高效的方式访问对象。然后,您可以使用一个单独的
    NSMutableArray
    ,该数组仅用于显示目的:它允许对存储在
    NSMutableDictionary
    中的相同对象进行有序的组织。请记住,将对象添加到数组或字典时,通常不会创建新副本,而是保留exi
    [mutable removeObjectsInArray:newArray];
    [mutable addObjectsFromArray:newArray];