我是 Objective-C 的新手,所以请多多包涵。我需要创建一个名称=值对的数组(或一组),其中一个条件是名称可以在集合中重复(因此我不能使用 NSMutableDictionary。)我发现 NSMutableSet 似乎是我需要的,但我的现在的困境是如何向其中添加两个 NSString 对象?
4 回答
您仍然可以使用字典,但对于值,请使用数组或集合。这样,您可以将相同的键映射到多个不同的值。
我不会使用集合,我认为您仍然应该使用NSMutableDictionary
as 作为问题的根源是基于键的查找。
您想要做的是将 aNSMutableArray
作为“值”,将名称作为键。如果该键尚未使用,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
,但我认为自定义包装器对象在语义上会更好。
您可能也不能使用 NSMutableSet ,因为集合通过哈希进行唯一化。如果您有两个具有相同哈希的对象(例如两个具有相同字符的 NSString),那么您最终也会在集合中得到一个字符串。
您可能希望使用 NSMutableArray 放置一个对象,该对象具有指向实际对象的键属性和值属性。或者,您可以自己在 NSArray 中获取值,如果您正在寻找某个值,则可以遍历数组并获取具有匹配键的对象。或者更优雅地使用 NSPredicate 按键过滤数组。
有关如何使用谓词过滤数组,请参见此处: http: //www.cocoanetics.com/2010/03/filtering-fun-with-predicates/
您应该选择 NSDictionary,因为它是哈希映射的并且速度更快。您可以创建一个具有数组类型属性的自定义类。将所有值存储在那里并将该对象用作值并放置一个键。