2016-03-18 4 views
0

У меня есть вопрос о NSMutableDictionary,Objective C NSMutableDictionary

Скажем, у меня есть два набора NSMutableDictionary:

NSMutableDictionary *oddNumber 
NSMutableDictionary *randomNumber 

Есть ли функция, чтобы проверить значение randomNumber является подмножеством значения oddNumber или нет ?

+1

Нет там нет; вам придется написать его самостоятельно или уговорить кого-то здесь сделать это за вас. – Droppy

ответ

1

Вы можете сделать что-то вроде этого,

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); 
+0

Сэр это функция intersectSet: дорогая? Есть ли какая-либо другая функция, имеющая меньшую рабочую нагрузку? – Neo

+1

@Neo Если производительность имеет значение для вас, конечно, у вас есть способ проверить, достаточно ли для вас это решение, верно? – Kevin

+0

Я знаю, что много функций работает с другим алгоритмом, но я знаю, что один быстрее для больших данных для вычисления, а некоторые небольшие данные работают быстрее с другой функцией – Neo

0

Вы можете получить значения для каждого словаря, используя метод values. Это возвращает массив. Затем вы можете преобразовать эти массивы в множества, которые имеют методы для проверки того, является ли один набор подмножеством другого.

0

Посмотрите на те ценности, которые у вас есть. Убедитесь, что у них есть метод isEqual: и хэш-метод, поэтому вы можете добавить их в набор. Создайте NSSet со всеми значениями второго словаря, затем перейдите через первый словарь и проверьте, какие значения находятся в наборе.

Обратите внимание, что при создании набора с N значениями требуется время O (N), если значения имеют достойную хеш-функцию, а поиск значения в наборе - это постоянное время.

0

Short:

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; 
    } 
}]; 
+0

Большое спасибо bro = D – Neo