Проблема объединения NSMutableSets
У меня есть следующий код:
NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols];
NSMutableArray* fetchedSymbolsArray = [NSMutableArray array];
for (NSDictionary* symbol in fetchedSymbols) {
[fetchedSymbolsArray addObject:[NSDictionary dictionaryWithObject:[symbol valueForKey:@"symbol"] forKey:@"symbol"]];
}
NSMutableSet* serverSet = [[NSMutableSet alloc] initWithArray:fetchedSymbolsArray];
[localSet unionSet:serverSet];
for (NSDictionary* symbol in localSet) {
NSLog(@"%@",[symbol valueForKey:@"symbol"]);
}
Я хочу, чтобы все в serverSet было в localSet. Этот код не отражает этого.
Также было бы предпочтительно, если бы в localSet не добавлялись какие-либо дубликаты.
Править: Вот мой журнал:
2011-08-16 17:46:28.887 Stream[94612:207] YHOO
2011-08-16 17:46:28.887 Stream[94612:207] GOOG
2011-08-16 17:46:28.887 Stream[94612:207] INTC
2011-08-16 17:46:28.888 Stream[94612:207] BIDU
2011-08-16 17:46:28.888 Stream[94612:207] INTC
2011-08-16 17:46:28.888 Stream[94612:207] BIDU
2011-08-16 17:46:28.888 Stream[94612:207] AAPL
2011-08-16 17:46:28.888 Stream[94612:207] AAPL
2011-08-16 17:46:28.889 Stream[94612:207] AMD
2011-08-16 17:46:28.889 Stream[94612:207] GMCR
2 ответа:
Попробуйте
[localSet unionSet:serverSet]
EDIT
Вот код, который просто использует символы вместо
NSDictionary
s:NSArray *symbols = [NSArray arrayWithObjects:@"AAPL",@"GOOG",@"INTC",@"YHOO",nil]; NSArray *fetchedSymbols = [NSArray arrayWithObjects:@"AMD",@"BIDU",@"GOOG",@"GMCR",@"INTC",@"YHOO",nil]; NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols]; NSMutableSet* serverSet = [[NSMutableSet alloc] initWithArray:fetchedSymbols]; [localSet unionSet:serverSet]; for (id symbol in localSet) { NSLog(@"%@",symbol); } 2011-08-16 18:25:22.107 so7086790[39810:a0f] YHOO 2011-08-16 18:25:22.116 so7086790[39810:a0f] AMD 2011-08-16 18:25:22.116 so7086790[39810:a0f] AAPL 2011-08-16 18:25:22.116 so7086790[39810:a0f] INTC 2011-08-16 18:25:22.117 so7086790[39810:a0f] GMCR 2011-08-16 18:25:22.117 so7086790[39810:a0f] GOOG 2011-08-16 18:25:22.118 so7086790[39810:a0f] BIDU
Вы неправильно расположили ваш serverSet и localSet в объединении-изменяемый набор является приемником метода " unionSet:", а не аргументом.
NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols]; NSMutableArray* fetchedSymbolsArray = [NSMutableArray array]; for (NSDictionary* symbol in fetchedSymbols) { [fetchedSymbolsArray addObject:[NSDictionary dictionaryWithObject:[symbol valueForKey:@"symbol"] forKey:@"symbol"]]; } NSMutableSet* serverSet = [[NSMutableSet alloc] initWithArray:fetchedSymbolsArray]; [localSet unionSet:serverSet]; for (NSDictionary* symbol in localSet) { NSLog(@"%@",[symbol valueForKey:@"symbol"]); }
Обратите внимание, что набор, по определению, не допускает повторяющихся записей. Но это не означает, что у вас не будет дубликатов значений в словаре, это означает, что у вас не будет одного и того же" равного " словаря дважды (два словаря равны, если каждый из них содержит одинаковое количество записей и для данного ключа соответствующие объекты значений в каждом словаре удовлетворяют условию isEqual: test).
Чтобы избежать дублирования определенного значения словаря, вам придется добавлять их самостоятельно. Я бы рекомендовал вам создать временный набор, который содержит фактические значения для ключа "symbol" и использовать этот набор, чтобы проверить, был ли он уже добавлен.
NSMutableSet *localSetValues = [[NSMutableSet alloc] init]; // Add local set values for (NSDictionary *symbol in localSet) { [localSetValues addObject:[symbol valueForKey:@"symbol"]]; } // Add server set, conditionally for (NSDictionary *symbol in serverSet) { if (![localSetValues containsObject:[symbol valueForKey:@"symbol"]]) { [localSet addObject:symbol]; } } // Cleanup [localSetValues release];
Вместо
[localSet unionSet:serverSet];