gpt4 book ai didi

objective-c - NSMutableSet 包含重复项

转载 作者:太空狗 更新时间:2023-10-30 03:47:21 27 4
gpt4 key购买 nike

我有一个名为 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]]];
}

我根据此处回答的另一个问题覆盖了我的 card 类的 isEqual 方法:

- (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 个副本)。

最佳答案

除了 isEqual 之外,您还需要覆盖 hash

事实上,您总是需要确保这两种方法协同工作。来自 Apple's documentation :

If two objects are equal (as determined by the isEqual: method), they must have the same hash value. This last point is particularly important if you define hash in a subclass and intend to put instances of that subclass into a collection.

像这样的东西应该可以工作:

- (NSUInteger)hash {
return [[self cardName] hash];
}

这样你的散列取决于你用来进行比较的相同信息。

NSMutableSet 等数据结构使用散列来快速将对象分组到不同的桶中。重要的是,如果两个对象相等,则它们具有相同的散列值。 (但是,如果两个对象具有相同的散列但不相等,这没关系。因此您始终可以从 hash 返回相同的数字,但这样您的性能将与使用数组相同。数据结构!)

关于objective-c - NSMutableSet 包含重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com