我有一个名为的自定义类card
我需要从随机大小的卡片数组中创建一组 10 张独特的卡片。另外,我需要首先包含所有列入白名单的卡,以确保它们始终包含在内。
我的问题是白名单中的卡片(并且只有白名单)可能会在集合中重复。随机添加的卡片永远不会重复,并且计数始终正确(10)。我不明白为什么isEqual
似乎有时有效,但并不总是有效。
这是我创建集合的地方(randoms
是要从中挑选的潜在卡片的数组):
NSMutableSet *randomCards = [NSMutableSet setWithCapacity:10];
[randomCards addObjectsFromArray:whiteListArray];
while ([randomCards count] < 10) {
NSNumber *randomNumber = [NSNumber numberWithInt:(arc4random() % [randoms count])];
[randomCards addObject:[randoms objectAtIndex:[randomNumber intValue]]];
}
我重写了isEqual
方法对我的card
基于此处回答的另一个问题的课程:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToCard:other];
}
- (BOOL)isEqualToCard:(Card *)myCard {
if (self == myCard) {
return YES;
}
if ([self cardName] != [myCard cardName] && ![(id)[self cardName] isEqual:[myCard cardName]])
return NO;
return YES;
}
它似乎工作得很好,除了当我添加白名单卡时,我无法弄清楚我是如何得到重复的(但永远不会超过 2 个副本)。
你需要覆盖hash
此外isEqual
.
事实上,你always需要确保这两种方法一起工作。从苹果的文档 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html:
如果两个对象相等(由 isEqual: 方法确定),则它们必须具有相同的哈希值。如果您在子类中定义哈希并打算将该子类的实例放入集合中,那么最后一点尤其重要。
像这样的东西应该有效:
- (NSUInteger)hash {
return [[self cardName] hash];
}
这样,您的哈希值取决于您用于进行比较的相同信息。
哈希值由数据结构使用,例如NSMutableSet
快速将对象分组到不同的存储桶中。重要的是,如果两个对象相等,则它们具有相同的哈希值。 (但是,如果两个对象具有相同的哈希值但不相等,这是可以的。因此您始终可以从hash
,但是这样你的性能将与使用数组相同。数据结构!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)