Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 组合可变集的问题_Iphone_Objective C_Cocoa_Nsset_Nsmutableset - Fatal编程技术网

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(@“%@”,集);是的,你说得对,我没有很清楚地区分平等词典和不平等词典。更新。