Problem combining NSMutableSets
I have the following code:
NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols];
NSMutableArray* fetchedSymbolsArray = [NSMutableArray array];
for (NSDictionary* symbol in fetchedSymbols) {
[fetchedSymbolsArray addObject:[NSDictionary dictionaryWithObject:[symbol valueForKey:@"symbol"] forKey:@"symbol"]];
}
NSMuta开发者_Go百科bleSet* serverSet = [[NSMutableSet alloc] initWithArray:fetchedSymbolsArray];
[localSet unionSet:serverSet];
for (NSDictionary* symbol in localSet) {
NSLog(@"%@",[symbol valueForKey:@"symbol"]);
}
I want everything in serverSet to be in localSet. This code does not reflect this.
It would also be preferable if any duplicates were not added to localSet.
EDIT: Here is my log:
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
try [localSet unionSet:serverSet]
EDIT
Here's code that just uses symbols instead of 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
You've got your serverSet and localSet around the wrong way in the union - the set being modified is the receiver of the method "unionSet:", not the argument.
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"]);
}
Note that set's, by definition, won't allow duplicate entries. But that doesn't mean that you won't have duplicates of values within the dictionary, it means that you won't have the same "equal" dictionary twice (two dictionaries are equal if they each hold the same number of entries and, for a given key, the corresponding value objects in each dictionary satisfy the isEqual: test).
To avoid duplicates of a particular dictionary value, you'd have to add them yourself. I'd recommend you create a temporary set which contains the actual values for the "symbol" key and use that set to test whether it's already been added.
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];
Instead of
[localSet unionSet:serverSet];
精彩评论