首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CFArray和CFDictionary中使用CFEqual

在CFArray和CFDictionary中使用CFEqual
EN

Stack Overflow用户
提问于 2011-02-16 20:06:47
回答 1查看 1.3K关注 0票数 0

我有包含NSDictionaries的NSArray。我需要将它转换为包含CFMutableDictionary类型的项的CFMutableArray,这些项具有char*键和值。

代码语言:javascript
复制
- (CFArrayRef)cStringDataSet {
CFArrayCallBacks cfTypeCallBacks = {0, NULL, NULL, NULL, CFEqual};
CFMutableArrayRef cStrDataSet = CFArrayCreateMutable(NULL, 0, &cfTypeCallBacks);

CFDictionaryKeyCallBacks charKeyCallBacks = {0, NULL, NULL, NULL, charEqual, charHash};
CFDictionaryValueCallBacks charValueCallBacks = {0, NULL, NULL, NULL, charEqual};

for (NSDictionary *dict in dataSet) {
    CFMutableDictionaryRef cStrDict = CFDictionaryCreateMutable(NULL, 0, &charKeyCallBacks, &charValueCallBacks);

    for (NSString *key in [dict allKeys]) {
        const char *cStrKey = [key UTF8String];
        const char *cStrValue = [[[dict objectForKey:key] description] UTF8String];

        CFDictionaryAddValue(cStrDict, cStrKey, cStrValue);
    }

    CFArrayAppendValue(cStrDataSet, cStrDict);
}

return cStrDataSet;
}

charEqual和charHash的定义如下:

代码语言:javascript
复制
Boolean charEqual(const void *ptr1, const void *ptr2) {
char *char1 = (char*)ptr1;
char *char2 = (char*)ptr2;

if (strlen(char1) != strlen(char2)) {
    return false;
}

return !strncmp(char1, char2, strlen(char1));
}

CFHashCode charHash(const void *ptr) {
    return (CFHashCode)((int)ptr);
}

现在我想使用CFEqual来比较两个CFArrayRefs,但是函数charEqual从未被调用过,并且CFEqual总是返回"false“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-16 22:14:19

您违反了相等和散列代码的约束。如果两个字符串比较相等,则它们也必须具有相同的散列码。如果字典是使用存储桶实现的,它将首先计算一个散列码,只有在找到该散列码的匹配项时,它才会调用比较函数。

你需要确保charEqual(char1, char2)只有在 charHash(char1) == charHash(char2)的时候才是真的,这意味着你需要根据字符串的值而不是它的地址重新实现charHash

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5016207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档