2011-02-16 46 views
0

我有NSArray包含NSDictionaries。我需要將它轉換爲 CFMutableArray,其中包含具有char *鍵和值的CFMutableDictionary類型項目。使用CFEqual與CFArray和CFDictionary

- (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定義如下:

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 2個CFArrayRefs,但功能charEqual,不會被調用CFEqual始終返回 「假」。

+0

爲什麼你這樣做`if(strlen(char1)!= strlen(char2))`?我想,你想比較指針指向的值而不是指針長度。如果這是你想要的,`if`語句永遠不會被執行! – Mahesh 2011-02-16 12:12:56

+0

AFAIK,strlen返回以null結束的字符串的長度,所以它會比較char1和char2指向的值的長度。但是現在我發現這個檢查是多餘的,感謝評論 – igoris 2011-02-16 12:32:02

回答

1

您違反了對等號和哈希碼的限制。如果兩個字符串比較相等,那麼它們也必須具有相同的哈希碼。如果字典是使用存儲桶實現的,它將首先計算一個哈希碼,並且只有當它找到該哈希碼的匹配時,它纔會調用比較函數。

你需要確保charEqual(char1, char2)是真的只有charHash(char1) == charHash(char2),這意味着你需要基於字符串的價值,而不是它的地址重新實現charHash

相關問題