- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我重写了 isEquals
和 hash
来比较自定义对象,以便能够从 NSArray
中删除重复项。问题是我在不包含重复项的列表中遗漏了一些值,而且我的 hash
或 isEquals
实现似乎是错误的。自定义对象是一个 Course 对象,它有一些变量,例如: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];
}
然后,在查询数据库之后,我将值放入一个数组中,然后放入一个集合中,该集合应该像这样删除重复的项目:
NSMutableSet *noDuplicates = [[NSMutableSet alloc] initWithArray:tempResults];
你能看出我在 isEquals
或 hash
实现中做错了什么吗?
非常感谢。
最佳答案
第 1 步。确定使用哪些实例变量/状态来确定相等性。确保它们存在属性是个好主意(如果您愿意,它们可以是在 class extension 中声明的私有(private)属性)。
第 2 步。根据这些实例变量编写哈希函数。如果所有重要的属性都是对象,您可以将它们的哈希值异或在一起。您也可以直接使用 C 整数等。
步骤 3. 编写 isEqual:
通常的模式可能是首先测试两个对象是否在定义了 isEqual:
的方法的类或子类中然后测试所有属性的相等性。
因此,如果一个类 Person 有一个名称属性(NSString 类型)和一个数字属性(int 类型),它们一起定义了一个唯一的人,hash
可能是:
-(NSUInteger) hash
{
return [[self name] hash] ^ [self number];
}
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;
}
我不认为它在文档中被列为明确要求,但可能假设相等性是对称的和可传递的,即
[a isEqual: b] == [b isEqual: a]
对于所有 a 和 b[a isEqual: b] && [b isEqual: c]
对所有 a、b、c 暗示 [a isEqual: c]
因此,如果您为子类重写 isEqual:
时必须小心,以确保它可以双向工作。这也是为什么注释,不要使用上面的[self class]
。
关于iphone - 帮助 isEquals 和 hash in iphone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545722/
考虑以下代码 OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]]; [[[mock expect] andReturnV
我正在尝试使用 .isEqual 比较两个对象来自 lodash-node 包的方法。即使对象相同,.isEqual返回 false . var _ = require('lodash-node');
LocalDate在 Java 中有两个类似的方法 equals和 isEqual . 它们之间有什么区别?当他们输出不同的结果时? 最佳答案 LocalDate.equals ,像大多数其他人一样
此函数检查两个对象是否具有相同的值: _.isEqual = (a, b) => { const aKeys = Object.getOwnPropertyNames(a) const bKe
const car = new Map([['100','200']]); const bike = new Map([['200','100']]); _.isEqual(car,bike); //
我正在尝试比较两种颜色,但无法得到正确的结果: 这是我的代码: NSLog(@"selfColor = %@",selfColor); NSLog(@"left = %@",left); NSLog(
背景 我有一个由第 3 方库提供的方法,它返回一个 CLBeacons 数组。 - (void)beaconManager:(ESTBeaconManager *)manager didR
Apple 的文档说如果我覆盖 isEqual: 那么我必须覆盖 hash 以确保哈希值对于被认为相等的两个对象应该相同等于: 然后我阅读了关于哈希的文档,下面是其中的一部分: Therefore,
我有一个类叫 Contact; 在Contact中我有(要测试的简单版本,还没有散列) - (BOOL)isEqual:(id)other { if (other == self)
本文整理了Java中java.time.ZonedDateTime.isEqual()方法的一些代码示例,展示了ZonedDateTime.isEqual()的具体用法。这些代码示例主要来源于Gith
我看到 Julia 有 3 种不同的方式 做平等。 == , === , 和 isequal 我应该使用哪个,何时使用? 最佳答案 ===是内在的平等。 在原语上,它是值相等:如果它们具有相同的位级表
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
我有一个使用下划线 isEqual 来比较两个 JSON 字符串的问题。目前我在主干中做了一个应用程序,我正在使用 _.isEqual(savedModel.toJSON(),changedModel
我有一个类,我用它来传递带有文本标签的选择器: @interface TableLink : NSObject @property (nonatomic, strong) NSString* name
我有一个烦人的问题,我试图解决它,但它只是没有发生,所以要么我错过了一些愚蠢的东西,要么我做错了。 基本上 id 喜欢检查一个字符串,如果它是 no,则加载空白字符串,如果还有其他内容,则加载真正的字
最近我一直在研究 java8 的新特性,以便更好地理解它们。 当尝试使用 Stream.filter 进行一些操作时,我发现了 Predicate.java 的源代码,在其中我发现了以下 isEqua
我有一个重写 isEqual 方法的人员类: #import "People.h" @implementation People @synthesize name = _name; -(BOOL)is
喜欢 class A :NSObject { let a :Int let b :UIColor } 我不想通过一一比较所有属性来实现 isEqual。如果那样,当我添加另一个属性时,
我有两个自定义 NSManagedObject 类:Notes 和 Tags。 当我覆盖 Tags 类中的 isEqual: 函数时,我收到如下错误消息: 'Class 'Tags' for enti
我是一名优秀的程序员,十分优秀!