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

时间:2013-11-17 19:52:58

标签: objective-c nsmutablearray

我在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];

我想避免添加imageDataObject,如果它已经存在于imagesArray中。 如果imageId已经在imagesArray对象中,则imageDataObject是重复的。 imageId是来自URL的字符串值。

我尝试过containsObject但它没有用。

我知道有类似的问题,但对我没什么用。

请帮忙。

2 个答案:

答案 0 :(得分:1)

您需要为-isEqual:课程实施-hashImageData。正确执行此操作后,-containsObject:或一组(例如NSMutableOrderedSet)将能够正常工作。

您没有解释imageId的类型。如果它是一个对象类型,那么你可以捎带它的相等定义。如果它是一个整数类型,你可以做一些简单的事情,比如使用整数值作为哈希,或者你可以用NSNumber的相等和哈希实现来实现它。

答案 1 :(得分:1)

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

  1. 看起来ImageData是您自己的类型。 NSArray的{​​{1}}通过调用containsObject:来确定匹配的对象是否存在。因此,在isEqual:上定义isEqual:hash(您必须实现两者),只根据您的ImageData(无论其类型是什么)来比较相等性。
  2. 如果您无法定义imageIDisEqual:,因为它们已经存在且不基于hash,那么您可以使用imagedID的{​​{1}}方法。这将调用一个块来依次测试数组的每个元素,并返回匹配的第一个元素的索引,如果不存在这样的元素,则返回NSArray。对indexOfObjectPassingTest:进行块测试,如果方法返回NSNotFound,则表示没有重复,并且应添加新的imageID
  3. 使用NSNotFound作为键将ImageData对象存储在ImageData中(如果NSMutableDictionary是基本类型,则将其包装为对象以将其用作密钥,例如将imageID包裹为imageID - 使用现代语法intNSNumber作为5)。您可以轻松地测试密钥存在(查找返回@5),或者只是添加新对象而不检查是否重复新值只会替换旧值。
  4. HTH