NSDictionary计数键数

时间:2013-02-02 17:51:39

标签: objective-c nsdictionary

我正在尝试创建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并更改它并将其放回来做长期工作,但如果可能的话我想使用此方法。

2 个答案:

答案 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];
    }
}