Проблема объединения NSMutableSets - PullRequest
2 голосов
/ 17 августа 2011

У меня есть следующий код:

   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.

EDIT: Вот мой журнал:

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 ]

6 голосов
/ 17 августа 2011

try [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
0 голосов
/ 17 августа 2011

У вас есть неправильный способ использования 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];
...