1

我正在尝试创建一个NSDictionary唯一键,每个值都是唯一键的计数。

IE

给定数组[apple, apple, banana, apple, pear, banana]我会得到字典......

{
    apple : 3,
    banana : 2,
    pear : 1
}

我敢肯定我之前看过代码,你可以在其中执行类似...

NSMutableArray *uniqueKeys = [NSMutableArray array];

for (NSString *string in myArray) {
    uniqueKeys[string]++;
}

但我不记得确切的语法是什么。

我知道我可以通过提取NSNumber并更改它并将其放回原处来完成它,但如果可能的话我想使用这种方法。

4

2 回答 2

5

似乎您可以使用 NSCountedSet。如果“apple”和“apple”相等,您将能够知道计数集中有多少个“水果”以及该集中有多少个“苹果”。

苹果的文档:

NSCountedSet 类声明了一个可变的、无序的模糊对象集合的编程接口。计数集也称为袋子。

每个插入到 NSCountedSet 对象中的不同对象都有一个与之关联的计数器。NSCountedSet 跟踪对象插入的次数,并要求删除对象的次数相同。因此,即使对象已多次添加到集合中,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
于 2013-02-02T18:02:17.800 回答
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];
    }
}
于 2013-02-02T19:02:05.623 回答