mad*_*erz 5 iphone hash objective-c
所以我重写isEquals并hash比较自定义对象,以便能够删除重复项NSArray.问题是我在列表中缺少一些不包含重复项的值,而且我的hash或isEquals实现似乎是错误的.自定义对象是具有像一些变量课程目标:id和name我会在这里把代码:
- (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)
你可以看到我在做错了isEquals或hash执行?
非常感谢.
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...:
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |