我正在尝试创建NSDictionary
个唯一键,每个值都是唯一键的计数。
即
给定数组[apple, apple, banana, apple, pear, banana]
我会得到字典......
{
apple : 3,
banana : 2,
pear : 1
}
我确信在你可以做某些事情之前我已经看过代码......
NSMutableArray *uniqueKeys = [NSMutableArray array];
for (NSString *string in myArray) {
uniqueKeys[string]++;
}
但我不记得确切的语法是什么。
我知道我可以通过提取NSNumber
并更改它并将其放回来做长期工作,但如果可能的话我想使用此方法。
答案 0 :(得分:5)
好像你可以使用NSCountedSet。 如果“apple”和“apple”相等,您将能够知道计数集中有多少“水果”以及集合中有多少“苹果”。
Apple的文档:
NSCountedSet类声明了a的编程接口 隐含的,无序的模糊对象集合。计数集是 也被称为包。
插入NSCountedSet对象的每个不同对象都有一个 与之相关的计数器。 NSCountedSetkeeps跟踪的数量 插入时间对象,并要求删除对象 相同的次数。因此,只有一个对象的实例 即使已将对象添加到集合倍数,也是NSSet对象 倍。由超类NSSet定义的count方法具有特殊性 意义;它返回不同对象的数量,而不是总数 对象在集合中表示的次数。 NSSet和 NSMutableSet类是为静态和动态集提供的 (分别)其元素不同。
<强>更新强>
以下是一个例子:
NSCountedSet * fruits = [[NSCountedSet alloc] initWithArray:@[@"apple", @"apple", @"banana", @"apple", @"pear", @"banana"]];
NSLog(@"fruit count = %d", [fruits count]);
NSLog(@"num apples = %d", [fruits countForObject:@"apple"]);
NSLog(@"num bananas = %d", [fruits countForObject:@"banana"]);
NSLog(@"num pears = %d", [fruits countForObject:@"pear"]);
NSLog(@"num oranges = %d", [fruits countForObject:@"orange"]);
将输出:
2013-02-02 13:07:59.058 test[46614:c07] fruit count = 3
2013-02-02 13:07:59.059 test[46614:c07] num apples = 3
2013-02-02 13:07:59.062 test[46614:c07] num bananas = 2
2013-02-02 13:07:59.062 test[46614:c07] num pears = 1
2013-02-02 13:07:59.063 test[46614:c07] num oranges = 0
答案 1 :(得分:1)
NSCountedSet提供了一个非常优雅的解决方案,但如果任何人出于任何原因需要字典而不是集合,那么创建这个“长手”的麻烦就不是 。 (如果你需要一次遍历所有的键和值,这可能会很有用)。
NSMutableDictionary *dictionaryWithKeysAndNumbers = [[NSMutableDictionary alloc] init];
for (NSString *key in keysArray) {
if ([dictionaryWithKeysAndNumbers valueForKey:key]) {
NSNumber *numberOfKeyInstances = [dictionaryWithKeysAndNumbers valueForKey:key];
NSInteger newValue = numberOfKeyInstances.intValue +1;
[dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:newValue] forKey:key];
}
else{
[dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:1] forKey:key];
}
}