Iphone 组合可变集的问题
我有以下代码:Iphone 组合可变集的问题,iphone,objective-c,cocoa,nsset,nsmutableset,Iphone,Objective C,Cocoa,Nsset,Nsmutableset,我有以下代码: NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols]; NSMutableArray* fetchedSymbolsArray = [NSMutableArray array]; for (NSDictionary* symbol in fetchedSymbols) { [fetchedSymbolsArray addObject:[NSDictionary dictionar
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
请尝试
[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
您在union中使用了错误的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"]);
}
请注意,根据定义,集合不允许重复条目。但这并不意味着字典中不会有重复的值,而是意味着不会有两个相同的“equal”字典(如果两个字典都包含相同数量的条目,并且对于给定的键,每个字典中对应的值对象都满足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];
很酷,现在它们都添加了。问题是有重复的。如何从集合中删除重复项?这可能是因为您认为相等的集合成员在被
NSSet
测试时并不真正相等(即,当发送isEqual:
时,它们返回false
)。看了你的日志,我很确定是这样的。字典的valueForKey:@“symbol”
结果是相同的,但字典本身并不相同。我明白了。考虑到这一点,如何在字典中检查字符串值或删除重复项?如果您只关心符号,只需将符号添加到集合中,而不是将其唯一成员添加到符号的NSDictionary
s。如果需要存储的不仅仅是符号,请创建自己的类,该类存储所需的属性,并通过将其符号值与作为参数传递的对象的符号值进行比较来响应isEqual:
。是否提供NSLog(@“%@”,localSet)
(在代码末尾)的输出?我不认为你所说的重复条目是正确的。似乎NSSet将消除真正相同的字典的重复。例如,尽管有两个单独的实例,但这会打印出只包含一个字典的集合:NSDictionary*dict1=[NSDictionary dictionaryWithObject:@“AAPL”forKey:@“symbol”];NSDictionary*dict2=[NSDictionary Dictionary WithObject:@“AAPL”forKey:@“symbol”];NSMutableSet*set=[NSMutableSet setWithObject:dict1];[设置addObject:dict2];NSLog(@“%@”,集);是的,你说得对,我没有很清楚地区分平等词典和不平等词典。更新。