Objective C NSMutableDictionary

Objective C NSMutableDictionary

我有一个关于 NSMutableDictionary 的问题,

假设我有两组 NSMutableDictionary:

NSMutableDictionary *oddNumber
NSMutableDictionary *randomNumber

是否有检查 randomNumber 的值是否是 oddNumber 值的子集的函数?

您可以使用 values 方法获取每个字典的值。这个returns一个数组。然后,您可以将这些数组转换为集合,这些集合具有检查一个集合是否是另一个集合的子集的方法。

你可以这样做,

    NSMutableDictionary *oddNumber;
    NSMutableDictionary *randomNumber;
    // Create arrays
    NSArray *arroddNumber = [oddNumber allValues];
    NSArray *arrrandomNumber = [oddNumber allValues];


    // Turn the arrays into sets and intersect the two sets
    NSMutableSet *oddNumberSet = [NSMutableSet setWithArray:arroddNumber];
    NSMutableSet *randomNumbersSet = [NSMutableSet setWithArray:arrrandomNumber];

    [oddNumberSet intersectSet:randomNumbersSet];

    // The Values present in both arrays
    NSLog(@"Common Values : %@", oddNumberSet);

看看你的价值观。确保它们有一个 isEqual: 方法和一个 hash 方法,这样你就可以将它们添加到一个集合中。使用第二个字典的所有值创建一个 NSSet,然后遍历第一个字典并检查集合中有哪些值。

请注意,如果值具有合适的哈希函数,则创建具有 N 个值的集合需要 O (N) 时间,并且在集合中查找值是常数时间。

短:

BOOL isSubset = [[oddNumber dictionaryWithValuesForKeys:[randomNumber allKeys]] isEqualToDictionary:randomNumber]

或更快:

__block BOOL isSubset = YES;
[randomNumber enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
    id value = [oddNumber objectForKey:key];
    if (!value || ![value isEqual:obj]) {
        isSubset = NO;
        *stop = YES;
    }
}];