检查可变集是否包含具有相同属性的对象

Ber*_*nie 2 objective-c

我想要做的是创建一个NSMutableSet,其目的是计算有多少对唯一数据.

基本上,我有两个可变数组; xCoordinatesyCoordinates,以及一个名为的自定义对象XYPoint.重合索引处的每个X坐标和Y坐标组合在笛卡尔平面上形成一个点.例如,在索引2处,xCoordinates数组中可能存在数字4,而yCoordinates数组中可能存在数字8,从而形成点(4,8).

现在,问题的关键,我想要做的是检查有多少独特的点.我打算用一个NSMutableSet来做.即:

for (int i = 0; i < [xCoordinates count]; i++) {

        XYPoint *newXY = [[XYPoint alloc] init];
        newXY.xCoordinate = [xCoordinates objectAtIndex:i];
        newXY.yCoordinate = [yCoordinates objectAtIndex:i];

        if ([distinct containsObject:newXY] == NO) {

            [distinct addObject:newXY];

        }

    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.有没有办法说;

if (there isn't an object in the set with an identical X coordinate property and Y coordinate property){

    Add one to the set;

}
Run Code Online (Sandbox Code Playgroud)

Tho*_*ing 7

在测试成员资格时,NSSet调用使用isEqual.
NSSet并且isEqualNSObject协议的一部分.

如果你的XYPoint类派生自NSObject,它继承了基于指针相等性的默认isEqual:implementation.它比较内存地址以测试2个对象是否相同.
由于您的比较标准是位置,您必须isEqual:在XYPoint类中覆盖并返回hash2个对象的x/y坐标是否相同.

另请参阅收藏集编程主题.还有一篇关于Mike Ash的平等和散列的非常详细的帖子.

更新
正如JeremyP在评论中指出的那样,您应该始终提供isEqual:覆盖时的实现YES.细节在上面的Mike Ash文章中有解释.在Stack Overflow上
还有一个问题讨论坐标的好散列函数.