Проблема объединения 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 2

2 ответа:

Попробуйте [localSet unionSet:serverSet]

EDIT

Вот код, который просто использует символы вместо NSDictionarys:

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];