0

我是 Objective-C 的新手,所以请多多包涵。我需要创建一个名称=值对的数组(或一组),其中一个条件是名称可以在集合中重复(因此我不能使用 NSMutableDictionary。)我发现 NSMutableSet 似乎是我需要的,但我的现在的困境是如何向其中添加两个 NSString 对象?

4

4 回答 4

1

您仍然可以使用字典,但对于值,请使用数组或集合。这样,您可以将相同的键映射到多个不同的值。

于 2013-01-12T09:01:39.280 回答
1

我不会使用集合,我认为您仍然应该使用NSMutableDictionaryas 作为问题的根源是基于键的查找。

您想要做的是将 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,但我认为自定义包装器对象在语义上会更好。

于 2013-01-12T09:07:40.077 回答
1

您可能也不能使用 NSMutableSet ,因为集合通过哈希进行唯一化。如果您有两个具有相同哈希的对象(例如两个具有相同字符的 NSString),那么您最终也会在集合中得到一个字符串。

您可能希望使用 NSMutableArray 放置一个对象,该对象具有指向实际对象的键属性和值属性。或者,您可以自己在 NSArray 中获取值,如果您正在寻找某个值,则可以遍历数组并获取具有匹配键的对象。或者更优雅地使用 NSPredicate 按键过滤数组。

有关如何使用谓词过滤数组,请参见此处: http: //www.cocoanetics.com/2010/03/filtering-fun-with-predicates/

于 2013-01-12T09:22:40.433 回答
0

您应该选择 NSDictionary,因为它是哈希映射的并且速度更快。您可以创建一个具有数组类型属性的自定义类。将所有值存储在那里并将该对象用作值并放置一个键。

于 2013-01-12T09:05:56.997 回答