Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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_Objective C_Nsmutablearray - Fatal编程技术网

Objective c 如果数组中已存在对象,请避免将对象添加到NSMutableArray

Objective c 如果数组中已存在对象,请避免将对象添加到NSMutableArray,objective-c,nsmutablearray,Objective C,Nsmutablearray,我正在imagesArray中添加imageDataObject ImageData *imageDataObject = [[ImageData alloc]initWithImageId:[[imageListArray objectAtIndex:indexPath.row]imageId] imageName:[[imageListArray objectAtIndex:indexP

我正在imagesArray中添加imageDataObject

ImageData *imageDataObject = [[ImageData alloc]initWithImageId:[[imageListArray objectAtIndex:indexPath.row]imageId]
                                                     imageName:[[imageListArray objectAtIndex:indexPath.row] imageName]
                                                         image:[UIImage imageWithData:imageData]];
[imagesArray addObject:imageDataObject];
如果imagesArray中已经存在imageDataObject,我希望避免添加它。 如果imageId已在imagesArray对象中,则imageDataObject是重复的。 imageId是来自URL的字符串值

我试过containsObject,但它不起作用

我知道也有类似的问题,但对我来说什么都不管用


请提供帮助。

您需要为
ImageData
类实现
-isEqual:
-hash
。一旦正确地执行此操作,则
-containsObject:
或集合(例如
NSMutableOrderedSet
)将能够正常工作


您没有解释imageId是什么类型的。如果它是一个对象类型,那么您可以利用它的相等定义。如果它是整数类型,您可以执行一些简单的操作,例如使用整数值作为散列,也可以根据
NSNumber
s等式和散列实现来实现它。

许多方法,这里有一个选择:

  • 看起来,
    ImageData
    是您自己的类型
    NSArray
    containsObject:
    通过调用
    isEqual:
    确定是否存在匹配的对象。因此,在
    ImageData
    上定义
    isEqual:
    hash
    (您必须同时实现这两个功能),它只是基于您的
    imageID
    (无论是哪种类型)进行相等性比较
  • 如果无法定义
    isEqual:
    hash
    ,因为它们已经存在并且不是基于
    imagedID
    的,那么可以使用
    NSArray
    indexOfObjectPassingTest:
    方法。这需要调用一个块来依次测试数组的每个元素,并返回匹配的第一个元素的索引,如果不存在这样的元素,则返回
    NSNotFound
    。对您的
    imageID
    进行块测试,如果该方法返回
    NSNotFound
    ,则您知道没有重复项,应添加新的
    ImageData
  • 使用
    imageID
    作为键,将
    ImageData
    对象存储在
    NSMutableDictionary
    中(如果
    imageID
    是一个基本类型,则将其包装为对象以将其用作键,例如将
    int
    包装为
    NSNumber
    ——使用现代语法
    5
    只是将
    @5
    包装为
    NSNumber
    )。您可以轻松测试键的存在性(查找返回
    nil
    ),或只是添加新对象,而不检查是否存在重复。新值将仅替换旧值

  • HTH

    是什么使两个
    imageDataObject
    相同?仅仅因为两个
    imageDataObject
    拥有相同的图像或图像名称并不使它们相同(就
    containsObject
    而言)。它们只是有相同的内容。可能尝试使用INSTEAD。没有实际的方法来判断您有两个不同但相同的图像。如果要避免重复,您需要跟踪图像的来源,并消除具有相同来源的图像。我只需检查唯一的imageid。使用
    将非常有用我们最好的选择。也许能帮助你