Objective c NSMutableSet包含重复项
我有一个名为Objective c NSMutableSet包含重复项,objective-c,xcode,nsmutableset,Objective C,Xcode,Nsmutableset,我有一个名为card的自定义类,我需要从随机大小的卡数组中创建一组10张唯一的卡。此外,我需要包括任何白名单卡第一,以确保他们总是包括在内 我的问题是白名单中的卡片(只有白名单)在集合中可能重复。随机添加的卡从不重复,计数始终正确(10)。我不明白为什么isEqual有时有效,但并不总是有效 这里是我创建集合的地方(randoms是要从中挑选的潜在卡的数组): 它似乎工作得很好,除非当我加入白名单卡片时,我不知道我是如何得到重复的(但不超过2份)。除了isEqual之外,你还需要覆盖散列 事实上
card
的自定义类,我需要从随机大小的卡数组中创建一组10张唯一的卡。此外,我需要包括任何白名单卡第一,以确保他们总是包括在内
我的问题是白名单中的卡片(只有白名单)在集合中可能重复。随机添加的卡从不重复,计数始终正确(10)。我不明白为什么isEqual有时有效,但并不总是有效
这里是我创建集合的地方(randoms
是要从中挑选的潜在卡的数组):
它似乎工作得很好,除非当我加入白名单卡片时,我不知道我是如何得到重复的(但不超过2份)。除了
isEqual
之外,你还需要覆盖散列
事实上,您始终需要确保这两种方法协同工作。发件人:
如果两个对象相等(由isEqual:方法确定),则它们必须具有相同的哈希值。如果在子类中定义hash并打算将该子类的实例放入集合中,那么最后一点尤为重要
像这样的方法应该会奏效:
- (NSUInteger)hash {
return [[self cardName] hash];
}
这样,您的散列依赖于用于进行比较的相同信息
散列被数据结构(如NSMutableSet
)用来将对象快速分组到不同的存储桶中。重要的是,如果两个对象相等,则它们具有相同的哈希值。(不过,如果两个对象具有相同的散列,但不相等,这没关系。因此,您可以始终从散列返回相同的数字,但这样您的性能将与使用数组一样。数据结构!)啊,太好了,非常感谢。我把自己引向了错误的道路,因为它似乎有时起作用,而其他人却不起作用。
- (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;
}
- (NSUInteger)hash {
return [[self cardName] hash];
}