NSDictionary,CustomKeys,比较

时间:2014-04-23 15:05:09

标签: ios objective-c hash comparison nsdictionary

解决

似乎两个-referenceDictionary都没有包含完全相同的信息......当然!修正了它,现在它完美无缺。

初步问题

自从我开始努力解决这个问题已经过了几个小时,这里是:

我有一个CustomClassA我用作NSDictionary键(很明显是对象:ForKey:方法)。

起初它根本不起作用,然后我在网上阅读thisthat和其他一些内容......

所以我试着通过这样做来覆盖-isEqual:-hash(也许少一点:p):

- (BOOL)isEqual:(id)anObject
{
    if([anObject isKindOfClass:[self class]])
    {
        NSLog(@"HASH = %@", [anObject hash] == [self hash] ? @"YES" : @"NO");
        NSLog(@"DICT = %@", [[self referenceDictionary] isEqualToDictionary:[anObject referenceDictionary]] ? @"YES" : @"NO");
        return [[self referenceDictionary] isEqualToDictionary:[anObject referenceDictionary]];
    }
    return false;
}
- (NSUInteger)hash
{
    NSUInteger prime = 31;
    NSUInteger result = 1;
    NSArray* values = [referenceDictionary allValues];
    for(id k in values)
    {
        result = prime * result + [k hash];
    }
    return result;
}

请注意,我的NSDictionary永远不会包含nil值,因为我确实会照顾这些值。

无论如何,当调用YES时,这两个方法都会在其中一个NSDictionary条目上返回[myDict objectForKey:myObject]

但是,似乎[myDict objectForKey:myObject]返回nil,即使自己“设置”后...... {/ p>

如果有人有时间帮助我解决我的问题,我会感激不尽!

此致 Cehm

修改 好的,为了更清楚这个问题。让我们假设两个类:ArtistSingle

然后我想创建一个NSDictionary,其中包含Artist作为key,此Artist key指向NSArray of "Single"s

例如,我有以下词典:

@{
artistA : @[song1, song2, song3],
artistB : @[songZ],
artistC : @[songF]
}

但现在问题是我想创建这样的字典:

for(Single* aSong in ArrayOfSingle)
    {
        Artist* anArtist = [[Artist alloc] initWithArtistName:aSong.artistName];
        if([data objectForKey: anArtist] == nil)
        {
            [data setObject:[[NSMutableArray alloc] init] forKey: anArtist];
        } else
        {
            NSLog(@"exists");
        }
        [[data objectForKey: anArtist] addObject:aSong];
    }

考虑到数据是可变的(简单的NSMutableDictionary)并且我永远不会改变anArtist(假设ARC仍保留其实例......)。

编辑2:

我超越了NSCopying:

- (id)copyWithZone:(NSZone *)zone {
    return [[[self class] allocWithZone:zone] initWithDictionary:referenceDictionary];
}

当我的CustomClass使用initWithDictionary:时,我认为通过这样做可以正常工作。

编辑3:

这是initWithDictionary:

-(id) initWithDictionary:(NSDictionary*) dictionary
{
    self = [super initWithDictionary:dictionary];
    if(self)
    {
        referenceDictionary = dictionary;
        title = [super notNullObjectForKey:@"title"];
        name = [super notNullObjectForKey:@"name"];
        category = [super notNullObjectForKey:@"category"];
        artist = [super notNullObjectForKey:@"artist"];
        ad_city = [super notNullObjectForKey:@"ad_city"];
    }
    return self;
}

0 个答案:

没有答案