在iphone中帮助isEquals和hash

mad*_*erz 5 iphone hash objective-c

所以我重写isEqualshash比较自定义对象,以便能够删除重复项NSArray.问题是我在列表中缺少一些不包含重复项的值,而且我的hashisEquals实现似乎是错误的.自定义对象是具有像一些变量课程目标:idname我会在这里把代码:

- (BOOL)isEqual:(id)object {
    if ([object isKindOfClass:[Course self]]) {
        return YES;
    } 
    if(self == object){
        return YES;
    }
    else {
        return NO;
    }
}

- (unsigned)hash {

    NSString *idHash = [NSString stringWithFormat: @"%d", self._id];
    return [idHash hash];
}
Run Code Online (Sandbox Code Playgroud)

然后,在查询数据库之后,我将值放在一个数组中,然后放在一个应该删除重复项的集合中,如下所示:

NSMutableSet *noDuplicates = [[NSMutableSet alloc] initWithArray:tempResults];
Run Code Online (Sandbox Code Playgroud)

你可以看到我在做错了isEqualshash执行?

非常感谢.

Jer*_*myP 11

步骤1.确定使用哪些实例变量/状态来确定相等性.确保它们存在属性是个好主意(如果你愿意,它们可以是在类扩展中声明的私有属性).

步骤2.根据这些实例变量编写哈希函数.如果计算的所有属性都是对象,则可以将它们的哈希值合并在一起.您也可以直接使用C ints等.

步骤3.编写isEqual:正常模式可能首先测试两个对象是在类或isEqual:定义的方法的子类中,然后测试所有属性的相等性.

因此,如果类Person具有名称属性(类型NSString)和数字属性(类型int),它们共同定义了一个唯一的人,则hash可能是:

-(NSUInteger) hash
{
    return [[self name] hash] ^ [self number];
}
Run Code Online (Sandbox Code Playgroud)

isEqual: 可能

-(BOOL) isEqual: (id) rhs
{
    BOOL ret = NO;
    if ([rhs isKindOfClass: [Person class]]) // do not use [self class]
    {
        ret = [[self name] isEqualToString: [rhs name]] && [self number] == [rhs number];
    } 
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我不认为它在文档中被明确要求,但可能认为等式是对称的和传递的,即

  • [a isEqual: b] == [b isEqual: a] 对于所有a和b
  • [a isEqual: b] && [b isEqual: c]暗示[a isEqual: c]所有a,b,c

因此,如果重写isEqual:子类以确保它可以双向循环,则必须小心.这也是评论的原因,不要[self class]在上面使用.


小智 -14

这就是实现 hash 和 isEqual 的方式(至少是为我识别重复项而工作的)

哈希函数

苹果文档说,对于那些被认为相等(逻辑上)的对象来说,两个对象的哈希值应该相同。因此我将实现如下哈希

-(unsigned int)hash  
{  
    return 234;//some random constant  
} 
Run Code Online (Sandbox Code Playgroud)

isEqual:方法实现类似于

-(BOOL)isEqual:(id)otherObject  
{  
  MyClass *thisClassObj = (MyClass*)otherObject;

  *// this could be replaced by any condition statement which proves logically that the two object are same even if they are two different instances* 

return ([thisClassObj primaryKey] == [self primaryKey]);

}
Run Code Online (Sandbox Code Playgroud)

更多参考这里:Techniques for Implements -hash on mutable Cocoa objects

为 Objective-C 集合实现 -hash / -isEqual: / -isEqualTo...: