我是Objective-C的新手,所以请耐心等待。我需要创建一个名称=值对的数组(或一组),其中一个条件名称可以在集合中重复(因此我不能使用NSMutableDictionary。)我发现NSMutableSet似乎是我需要的,但是我的困境现在是如何在其中添加两个NSString对象?
答案 0 :(得分:1)
您仍然可以使用字典,但对于值,请使用数组或集合。这样,您可以将相同的键映射到多个不同的值。
答案 1 :(得分:1)
我不会使用一个集合,我认为您仍然应该使用NSMutableDictionary
,因为问题的根源是基于密钥的查找。
您要做的是将NSMutableArray
作为'值',将名称作为键。如果尚未使用该密钥,请在字典中使用第一个值创建NSMutableArray
。如果已经使用了密钥,只需将值添加到字典内的NSMutableArray
。
以下是“setValueForKey”方法的一些示例代码:
NSMutableDictionary *dictionary = /* Some mutable dictionary stored as an instance variable or similar */
NSString *keyToAdd; id valueToAdd;
NSMutableArray *arrayForKey = [dictionary objectForKey:keyToAdd];
if (arrayForKey != nil) { // if the array has been created before earlier in the program
[arrayForKey addObject:valueToAdd]; // then just add the value directly to the array inside the dictionary
} else { // otherwise create the mutable array using the key
NSMutableArray *newMutableArray = [[NSMutableArray alloc] initWithCapacity:0];
[dictionary setObject:newMutableArray forKey:keyToAdd];
[newMutableArray addObject:valueToAdd];
}
要实现此逻辑,从技术上讲,您可以创建NSDictionary
的子类,但我认为自定义包装器对象在语义上会更好。
答案 2 :(得分:1)
您可能无法使用NSMutableSet,因为集合通过散列进行单独处理。如果你有两个具有相同哈希值的对象(比如两个具有相同字符的NSStrings),那么你最终只能在集合中使用一个字符串。
您可能希望使用NSMutableArray,其中放置一个具有key属性和指向实际对象的value属性的对象。或者,您可以自己在NSArray中获取值,如果要查找某个值,可以遍历数组并获取具有匹配键的对象。或者更优雅地使用NSPredicate按键过滤数组。
有关如何使用谓词过滤数组,请参阅此处:http://www.cocoanetics.com/2010/03/filtering-fun-with-predicates/
答案 3 :(得分:0)
你应该选择NSDictionary,因为它是哈希映射的并且更快。您可以创建具有array类型属性的自定义类。将所有值存储在那里并将该对象用作值并放入一个键。