Проблема объединения 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]
РЕДАКТИРОВАТЬ
Вот код, который просто использует символы вместо 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).
Чтобы избежать дубликатов определенного значения словаря, вы должны добавить их самостоятельно. Я бы порекомендовал вам создать временный набор, который содержит фактические значения для клавиши "символ", и использовать этот набор, чтобы проверить, был ли он уже добавлен.
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];